Python基礎第十一天——內置函數的補充、內置函數與lambda、遞歸
阿新 • • 發佈:2017-11-09
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、遞歸