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)
posted @   yybokeyuan  阅读(6)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示