day 14三元表达式、列表推导式、字典生成式、生成器、匿名函数

三元表达式
dog_name = 'crazy_dog1'

if dog_name == 'crazy_dog':
print('疯狂舔?')
else:
print('溜了')

三元表达式/列表推导式/字典生成式 只是让你的代码更少了,但是逻辑没有变化
print('疯狂舔?') if dog_name == 'crazy_dog' else print('666')

# 三元表达式只支持双分支结构

列表推导式
lt = [0,1,2,3,4]
lt = []
for i in range(10):
lt.append(i**2)
print(lt)

lt = [i ** 2 for i in range(10)]
print(lt)

dic = {'a': 1, 'b': 2}

lt = [(k, v) for (k, v) in dic.items()]
print(lt)

字典生成式
dic = {'a': 1, 'b': 2}

new_dic = {k * 2: v ** 2 for k, v in dic.items()}
print(new_dic)

字典生成式一般与zip(拉链函数-->列表里面包了元组)连用
z = zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4]) # 压缩方法,Python解释器的内置方法
for k,v in z:
print(k,v)

dic = {k: v ** 2 for k, v in zip(['a', 'b', 'c', 'd'], [1, 2, 3, 4])} # 不能写这种代码
print(dic)


生成器
生成器: 自定义迭代器, 生成器就是迭代器(自己造出来的)
yield关键字
迭代器对象: 具有__iter__, __next__的方法
def func():
return 123

f = func()
print(f) # 123


def func():
yield 456 # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
yield 101112 # 一个yield对应一个next
print(131415)

f = func() # 生成器
print(f) # <generator object func at 0x000001F0E44237D8>
f_iter = f.__iter__()
print(f_iter.__next__())
print(f_iter.__next__())
print(f_iter.__next__())


yield的三个特性

1. yield可以把函数变成生成器(自定制的迭代器对象,具有__iter__和__next__方法)
2. yield可以停止函数,再下一次next再次运行yield下面的代码
3. 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错


return 的特性
1. 返回值
2. 终止函数

def func():
yield [1,1,23] # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
# print(789) # yield会停止函数,当运行下一次next才会继续运行下面的代码
yield 101112 # 一个yield对应一个next
# print(131415)

g = func()
for i in g:
print(i)


用生成器自定制一个range方法
range(10)
1. 生成一个可迭代器对象 --- 》 我要把我的range函数变成一个可迭代对象(迭代器对象)
2. 丢一个10进去,然后通过for循环的迭代next会丢出0,1,2,3,4,5,6,7,8,9

def range(*args, step=1):
args = list(args)
if len(args) == 1:
count = 0
while count < args[0]:
yield count
count += step
elif len(args) == 2:
while args[0] < args[1]:
yield args[0]
args[0] += step


生成器表达式
把列表推导式的[]换成()
lt = [i for i in range(10000000)]
print(lt)
g = (i for i in range(10000000))
print(g)
print(g.__next__())

列表和元组的区别
列表就是一筐鸡蛋,元组是一只老母鸡(节省空间)



匿名函数
'''
def 函数名 ---> 有名函数
'''

匿名-->没有名字
匿名需要关键字lambda


lambda 参数:<代码块>

f = lambda x: x+1
res = f(1)
print(res)


匿名函数一般不单独使用,和 filter()/map()/sorted()/列表的sort()内置方法联用

salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000
}
salary_list = list(salary_dict.items())
print(salary_list) # [('nick', 3000), ('jason', 100000), ('tank', 5000), ('sean', 2000)]


def func(i): # i = ('sean', 2000), ('nick', 3000),('tank', 5000),('jason', 100000)
return i[1] # 2000,3000,5000,100000


salary_list.sort(key=lambda i: i[1]) # 内置方法是对原值排序
# 按照func的规则取出一堆元素2000,3000,5000,100000
# 然后按照取出的元素排序
print(salary_list)

new_salary_list = sorted(salary_list, key=lambda i: i[1], reverse=True) # 重新创建一个新的列表进行排序
print(new_salary_list)
salary_dict = {
'nick': 3000,
'jason': 100000,
'tank': 5000,
'sean': 2000
}

salary_list = list(salary_dict.items())
print(salary_list) # [('nick', 3000), ('jason', 100000), ('tank', 5000), ('sean', 2000)]


print(max(salary_list,key=lambda i:i[1]))
print(min(salary_list,key=lambda i:i[1]))

print(list(filter(lambda i: i[1] < 5000, salary_list))) #
print(list(map(lambda i: i[1] + 2000, salary_list)))
#



#不太熟悉的同学不要看
def sorted(iter, key=None, reverse=None):
iter.sort()
if key:
# key 是一个函数对象
lt = []
lt2 = []
for i in iter:
res = key(i)
lt.append(res)
lt2.append(i)
lt.sort()

lt3 = []
for i in lt:
for j in lt2:
if j[1] == i:
lt3.append(j)

if reverse:
lt3.reverse()
return lt3

if reverse:
iter.reverse()
return iter


print(sorted(salary_list, key=lambda i: i[1],
reverse=None)) # [('sean', 2000), ('nick', 3000), ('tank', 5000), ('jason', 100000)]


转载于:https://www.cnblogs.com/wwei4332/p/11348523.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值