码迷,mamicode.com
首页 > 编程语言 > 详细

Python基础第十一天——内置函数的补充、内置函数与lambda、递归

时间:2017-11-09 21:00:20      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:price   返回   sleep   end   数据库查询   soap   pytho   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、递归

标签:price   返回   sleep   end   数据库查询   soap   pytho   rand   优点   

原文地址:http://www.cnblogs.com/xiaoxiaobai/p/7811157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!