三元表达式 ,迭代器, 生成器,二分法

三元表达式

# x if x > y else y
##如果x大于y,值返回左边,不然则返回右边
#用一行代码表达一个函数需要做的事情,使代码更简洁


# 例1,
# res='x' if True else 'y'
# print(res)

迭代器

# 1. 什么是迭代器
# 什么是迭代?
# 迭代是一个重复的过程,但是每次重复都是基于上一次重复的结果而继续
#下列循环知识单纯的重复
# while True: #while循环取值,是单纯的重复。迭代取得是基于上一次取下一次的值
# print(1)
# 基于索引的迭代取值 #基于索引的方式可取值的对象不包括数字
#字符串,列表,字典
#例1,
# l=['a','b','c']
# i=0
# while i < len(l):
# print(l[i])
# i+=1

# 什么是迭代器?
# 迭代取值的工具

# 2. 为什么要用迭代器
# 优点
# 1. 提供一种不依赖索引的迭代取值方式 #比如,元组,列表都是不基于索引取值
# 2.占用内存小,迭代下一次的时候上一次的迭代的内容被回收(这也是缺点,无法索引取值)
# 缺点
# 1,不如按照索引取值的内容灵活
# 2,取值一次性的,只能往后取,且无法预测取值的格式
# 3. 如何用迭代器
# 可迭代的对象:str\list\tuple\dict\set\文件对象 (除了整形)
# 但凡内置有__iter__方法的对象都称之为可迭代对象
#例2,
# a='str' #a除了整形都可以使用__iter__内置方法
# a.__iter__()

# 迭代器对象: 文件对象
# 既内置有__iter__方法又内置有__next__方法的对象都称之为迭代器对象
# 调用可迭代对象下__iter__方法,会有一个返回值,该返回值就是内置的迭代器对象
#例3,
# a=[1,2,3,4]
# a_1=a.__iter__()
# a_1.__next__()
# 例4,
# iter(d)=d.__iter__
# next(d)=d.__next__
# len(d)=d.__len__

'''
# d={'k1':111,'k2':222,'k3':333}
# iter_d=d.__iter__()
# # print(iter_d)
#
# try: #ry方法,可以捕捉异常(报错文件)
# print(iter_d.__next__()) #输出第一次迭代的内容
# print(iter_d.__next__()) #输出基于上一次迭代的内容
# print(iter_d.__next__())
# print(iter_d.__next__()) #如果迭代内容为空(迭代完了),再次迭代则报错
# except StopIteration: #对应try,如果报错内容为StopIteration,输出下一行代码,
#即隐藏了报错内容,使代码得已继续运行
# print('取值完毕') #报错时执行的代码

'''
'''
# for循环的底层原理
d={'k1':111,'k2':222,'k3':333}

iter_d=d.__iter__() #赋值迭代对象
while True: #while循环迭代内容
try: #捕捉并处理报错内容的代码
v=iter_d.__next__() #产生迭代内容
print(v)
except StopIteration: #处理报错(迭代内容超过迭代对象的内容报错的情况)
break #报错时执行的内容(结束循环)
'''

# for k in d:
# print(k)
#for循环的底层原理:
# 1. 调用in后面那个值/对象的__iter__方法,拿到一个迭代器对象iter_obj
#如果对象不能迭代,则报错。比如数字类型
# 2. 调用迭代器对象iter_obj.__next__()将得到的返回值赋值变量名k,
# 循环往复直到取值完毕抛出异常StopIteration
# 3. 捕捉异常结束循环


生成器

生成器就是一种自定义的迭代器

如何得到生成器?
但凡函数内出现yield关键字,再去调用函数不会立即执行函数体代码,
会得到一个返回值,该返回值就是生成器对象,即自定义的迭代器
'''


# def func():
# print('first')
# yield 1 #yield与return的区别
# # yield运行到此处会暂停,return代表函数结束
# print('second')
# yield 2
# print('third')
# yield 3
#
#
# g=func() # g对应的就是一个生成器
# # print(g)
# #
# res1=next(g) #生成器开始运行,第一次迭代的结果就是yield 返回的内容,同时之前的代码也会运行
# print(res1)
# #
# res2=next(g) #生成器第二次迭代
# print(res2)
#
# res3=next(g) #生成器第三次迭代
# print(res3)
#
# next(g)

# 总结yield:
# 1. 提供一种自定义迭代器的解决方案
# 2. yield & return
# 相同点: 都可以返回值,返回值没有类型限制\个数限制
# 不同点: return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值


# 小练习
# 实现与range一样的功能,开头结尾和步长
# def my_range(start,stop,step=1):
# while start < stop:
# yield start
# start+=step


二分法


# 二分法是算法的一种;算法是将问题简单化的一种解决方法。
#
# 二分法的应用场景很局限:当我们有一个有序的序列:从小到大或从大到小;我们需要查找一个数是否在这个序列中,就可以运用二分法去解决问题。
#
# 二分法模拟成员运算in

'''
nums = [1, 13, 15, 23, 27, 31, 33, 57, 73, 81, 93, 94, 97, 101] # 从小到大排列的数字列表
def binary_search(find_num,nums):
print(nums)
if len(nums) == 0:
print('False')
return
# 功能
mid_index = len(nums) // 2
if find_num > nums[mid_index]:
# in the right
nums=nums[mid_index+1:] #nums[x:] 删除第x列之前的内容
# 重新运行功能,传入新列表
binary_search(find_num,nums)
elif find_num < nums[mid_index]:
# in the left
nums=nums[:mid_index]
# 重新运行功能,传入新列表
binary_search(find_num,nums)
else:
print('True')
'''

猜你喜欢

转载自www.cnblogs.com/wang-kai-1994/p/10059857.html