1. 程式人生 > >Python基礎第十一天——內置函數的補充、內置函數與lambda、遞歸

Python基礎第十一天——內置函數的補充、內置函數與lambda、遞歸

book ice args enc blog urn close 定義 rand

一、拾遺

1、生成器表達式形式的多個函數之間的協同工作。

例:做一包子吃一個包子

優點:更省內存。

以上例子的原理:      重點★★★★★

技術分享

源代碼:

import time
import random
# 裝飾器
def init(func):
    ‘‘‘生成器表達式的初始化‘‘‘
    def wrapper(*args,**kwargs):
        g=func(*args,**kwargs)
        next(g)
        return g
    return wrapper

def cook(people,count):
    ‘‘‘定義一個廚師‘‘‘
    for i in range(count):
        time.sleep(random.randrange(1,4))
        x=‘包子%s‘ % i
        print(‘\033[47m廚師做好的包子:%s\033[0m‘ %x)
        people.send(x)

@init
def eater(name):
    ‘‘‘定義一個吃貨‘‘‘
    while True:
        bun=yield
        time.sleep(random.randrange(1, 4))
        print(‘\033[46m%s開始吃%s\033[0m‘ %(name,bun))

cook(eater(‘小白‘),20)

2、三元表達式之生成器表達式的補充。

例:

要求:求一個商品文件中所有物品的價格總和

有一個記載了商品的.txt文件,裏面的內容如下:

技術分享

代碼如下:

技術分享

以上代碼太長,這裏用三元表達式中的列表解析來精簡代碼,但是列表解析是把文件內容都放到內存空間,會造成占用過多內存。所以最好是用生成器表達式,一來精簡代碼,二來節省內存。

代碼如下:

money = []
with open(‘shop_list‘,‘r‘,encoding=‘utf-8‘) as f:
    t = (float(line.split(‘|‘)[1]) * int(line.split(‘|‘)[2]) for line in f)
    print(sum(t))

輸出結果:

724280.0

3、模擬數據庫查詢操作

要求:把第2小點中的例子中的數據取出來,拼接成一個有結構一樣的數據,類似數據庫的查詢功能

分析:把所以數據查出來,它們只是一串字符串,然後把這些字符串拼接成一個字典的形式,這樣我們就能通過鍵找到相對應的值了。

商品列表如下:

技術分享

代碼如下:

goods_info = []         # 用來存放所有的商品,每件商品以字典的形式存放
with open(‘shop_list‘,‘r‘,encoding=‘utf-8‘) as f:
    goods_info = [{‘name‘:line.split(‘|‘)[0],‘price‘:line.split(‘|‘)[1],‘count‘:line.split(‘|‘)[2]} for line in f]
print(goods_info)

輸出結果:

技術分享
[{name: apple, price: 3.2, count: 1000}, {name: banana, price: 1.8, count: 600}, {name: ipad, price: 4000, count: 100}, {name: macbook pro, price: 10000, count: 30}, {name: soap, price: 2, count: 10000}]
View Code

將要求更改:只取價格大於等於4000的商品。

代碼如下:

goods_info = []         # 用來存放所有的商品,每件商品以字典的形式存放
with open(‘shop_list‘,‘r‘,encoding=‘utf-8‘) as f:
    goods_info = [{‘name‘:line.split(‘|‘)[0],‘price‘:float(line.split(‘|‘)[1]),‘count‘:int(line.split(‘|‘)[2])} for line in f                   if float(line.split(‘|‘)[1]) >= 4000]
print(goods_info)

輸出結果:

技術分享
[{name: ipad, price: 4000.0, count: 100}, {name: macbook pro, price: 10000.0, count: 30}]
View Code

二、內置函數與lambda

之前學過的函數都是有函數名的,該函數名是用於綁定值的,與變量名的定義類似,當創建一個函數時,此時函數名綁定了一個值,這個值的引用計數器則加1,一旦沒有函數名來引用這個值了,這個值將會被python的內存回收機制給回收。但是匿名函數除外。

1、匿名函數——lambda

(1)特性:

  (1)沒有函數名

  (2)函數參數的命名規則與有名函數是一樣的。

  (3)定義形參時直接寫參數名且不用加上括號

  (4)一行代碼即可完成創建函數

  (5)自帶return效果,所以一定有返回值

  (6)定義完後就會被python內存回收機制回收

(2)格式:

  lambda 函數的參數 :函數體 # 匿名函數的函數體就相當於有名函數的retturn返回值。

(3)應用場景:

有時我們只需要用一次函數時,且不想清理有名函數時便可以用到此匿名函數。

(4)例子:

Python基礎第十一天——內置函數的補充、內置函數與lambda、遞歸