python_August(迭代器、生成式)
迭代器
可迭代对象: 只要拥有iter方法的对象就是可迭代对象,下面的除了前两个,从字符串开始都是可迭代对象
height = 180 #整型
salary = 3.2 #浮点型
name = 'nick' #字符串
hobby_list1 = ['run','read'] #列表
hobby_tup = ('run','read') #元组
info_dict1 = {'name':'nick','weight':140} #字典
hobby_set = {'read','run','run'} #集合
在后面加点,然后打一个iter再按Tab键就能出来_iter_
列表使用iter
hobby_list = ['run','read']
hobby_list_iter = hobby_list.__iter__() #把列表变成可迭代对象
print(hobby_list_iter.__next__()) ##输出run
print(hobby_list_iter.__next__()) ##输出read
##再多输出一行就会报错
字典使用iter
info_dict = {'name':'nick','weight':140}
info_dict_iter = info_dict.__iter__()
print(info_dict_iter.__next__()) ##输出name
print(info_dict_iter.__next__()) ##输出weight
###改成value就会是nick、140
迭代器对象:拥有__iter__方法——>可迭代对象拥有__next__方法的才是迭代器对象,文件本身就是迭代器对象
- 先加iter变成迭代器对象,再加next变成迭代器
下面这个就是使用迭代器后,就不用使用for进行for i in xx给他列出
# 这一段代码如果用c写,就是for循环的原理
hobby_list2 = ['run','read']
hobby_list2_iter = hobby_list2.__iter__()
while True:
try:
print(hobby_list2_iter.__next__())
except:
break
三元表达式
dog_name = 'fenggou'
# 不推荐使用,你以后写程序,程序是越容易看懂越好,而不是写成一行,让别人说你是傻逼
print('远离他') if dog_name == 'fenggou' else print('盘他')
列表推导式
[i*2 for i in range(100)]
print(lis) ###输出0~198(而且是偶数)
# 千万不要写这样的东西,否则真的会被骂傻逼
lis1 = [i * 2 if i > 50 else i for i in range(100)]
print(lis1) ###输出前五十一个是0到50,其余是两倍
字典生成器
dic= dict.fromkeys([1,2,3,4],2)###有关fromkeys的使用忘了可以再看看
print(dic2)
keys = ['L','Y','M']
default_value = []
dic1 = dict.fromkeys(keys,default_value)###default_value的东西每个key拿到的一样
print(dic1)
default_value.append(1000)
print(dic1)
dic2 = {i:i**2 for i in range(10)}
print(dic)
#####分别输出
{1: 2, 2: 2, 3: 2, 4: 2}
{'L': [], 'Y': [], 'M': []}
{'L': ['1000'], 'Y': ['1000'], 'M': ['1000']}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
拉链函数
# 拉链函数
res = zip('abcd',[1,2,3,4])
print(res) ##输出<zip object at 0x000002575EFAA040>
dic = dict() #先定义一个空字典
for k,v in res:
dic[k] = v #res指向值放进去
print(dic)
####一个式子把上面的写完
print({k:v for k,v in zip('abcd',[1,2,3,4])})
生成器
# 生成器:自定义的迭代器,
# yield关键字:接收值,但是不会结束函数,而是继续运行下一行代码
def func():
yield
print('from 1')
yield 'middle'
print('from 2')
yield 'last'
print(type(func()))
# func调用之后变成了一个迭代器,yield默认返回None
gen = func()
# next(gen)###这样打印不出来yield后面输出
# next(gen)
# next(gen)
print(gen.__next__())###yield后面没有值,默认返回none
print('*'*50)
print(gen.__next__())
print('/'*50)
print(gen.__next__())
#输出
<class 'generator'>
###上面打印了一个类型
None
**************************************************
from 1
middle
//////////////////////////////////////////////////
from 2
last
yield: 接收值,但是不会结束函数,然后继续下一行代码,直到return
return: 返回值,直接结束函数,其它的特性和yield一模一样
模拟模块range
def range(*args,**kwargs):
start = 0
step = 1
if len(args) == 1:
# args = (10)
end = args[0]
elif len(args) == 2:
# args = (1,10)
start = args[0]
end = args[1]
elif len(args) == 3:
start = args[0]
end = args[1]
step = args[2]
else:
raise('传多值了')
count = start
while count < end:
yield count
count += step
print(list(range(2,10,3)))
递归
递归: 函数调函数自己,类似于循环,但是这个循环必须得有结束条件
import time
def f1(x): # x=0
print(x) # 0 1
time.sleep(0.1)
x += 1 # 1 2
if x == 101:
return ###return后面不执行
f1(x) # x=1
f1(0)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步