今日早晨默写:
有参认证功能装饰器加使用
=================================================================================
可迭代对象与迭代器对象
1.什么是迭代器
迭代是一个重复的过程,但每次重复都是基于上一次重复的结果而继续
下列循环知识单纯的重复
while True:
print(1)
# 基于索引的迭代取值
l=['a','b','c']
i=0
while i < len(l):
print(l[i])
i+=1
什么是迭代器?
迭代取值的工具
2.为什么用迭代器
迭代器
优点:
1.提供一种不依赖索引迭代取值的方式
2.更节省内存
缺点:
1.不如按照索引的取值方式灵活
2.取值一次性的,只能往后取,无法预测值的个数
3.如何用迭代器
可迭代的对象:strlist upledictset文件对象
但凡内置有__iter__方法的对象都称之为可迭代对象
迭代器对象:文件对象
既内置有__iter__方法又内置有__next__方法的对象都称之为迭代器对象
调用可迭代对象下__iter__方法,会有一个返回值,该返回值就是内置的迭代器对象
'''
# s='abcdef'
# l=['a','b','c']
# d={'k1':111,'k2':222,'k3':333}
# iter_d=d.__iter__()
# # print(iter_d)
#
# try:
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__())
# print(iter_d.__next__())
# except StopIteration:
# print('取值完毕')
d={'k1':111,'k2':222,'k3':333}
# d={1,2,3,4,5}
# d=[1,2,3,4]
# iter_d=d.__iter__()
# iter_d=iter(d) #d.__iter__
# print(next(iter_d)) #iter_d.__next__()
# print(len(d))
print(d.__len__())
# print(iter_d.__iter__().__iter__().__iter__() is iter_d)
# print(d.__iter__().__next__())
# print(d.__iter__().__next__())
# print(d.__iter__().__next__())
# while True:
# try:
# v=iter_d.__next__()
# print(v)
# except StopIteration:
# break
#
# print('第二次取值')
#
# iter_d=d.__iter__()
# while True:
# 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
# print('second')
# yield 2
# print('third')
# yield 3
#
#
# g=func()
# # print(g)
#
# res1=next(g)
# print(res1)
#
# res2=next(g)
# print(res2)
#
# res3=next(g)
# print(res3)
#
# next(g)
# 总结yield: # 1. 提供一种自定义迭代器的解决方案 # 2. yield & return # 相同点: 都可以返回值,返回值没有类型限制个数限制 # 不同点: return只能返回一次值,yield却可以让函数暂停在某一个位置,可以返回多次值 #原理 # def my_range(start,stop,step=1): # while start < stop: # 5 < 5 # yield start # 3 # start+=step #start=5 # range(1,5,2) # 1 3 # for i in my_range(1,5000000000000000000000000000000000000000000,2): # 1 3 # print(i)
小练习
1.函数递归调用
在调用一个函数的过程又直接或者间接地调用该函数本身,称之为递归调用
递归必须满足两个条件:
1.每进入下一次递归调用,问题的规模都应该有所减少
2.递归必须有一个明确的结束条件
以下递归只是单纯的重复,没有意义
# 以下递归只是单纯的重复,没有意义
def func():
print(1)
print(2)
print(3)
func()
func()
def bar():
print('from bar')
foo()
def foo():
print('from foo')
bar()
foo()
递归有两个明确的阶段
1.回溯
2.递推
# age(5)=age(4)+2 #这是回溯阶段 然后再进行递推 # age(4)=age(3)+2 # age(3)=age(2)+2 # age(2)=age(1)+2 # age(1)=18 # age(n)=age(n-1)+2 # n > 1 # age(1)=18 # n = 1 # def age(n): # if n == 1: # return 18 # return age(n-1)+2 # # print(age(5))
递归取值相关代码
l=[1,[2,[3,[4,[5,[6,[7,[8,[9,]]]]]]]]]
def func(list1):
for item in list1:
if type(item) is not list:
print(item)
else:
# 如果是列表,应该...
func(item)
func(l)
nums=[3,5,7,11,13,23,24,76,103,111,201,202,250,303,341]
find_num=203
for num in nums:
if num == find_num:
print('find it')
break
else:
print('not exists')
二分法
nums = [3, 5, 7, 11, 13, 23, 24, 76, 103, 111, 201, 202, 250, 303, 341]
def binary_search(list1, find_num):
print(list1)
if len(list1) == 0:
print('not exist')
return
mid_index = len(list1) // 2
if find_num > list1[mid_index]:
print('in the right')
binary_search(list1[mid_index + 1:], find_num)
elif find_num < list1[mid_index]:
print('in the left')
binary_search(list1[:mid_index], find_num)
else:
print('find it')
binary_search(nums, 111)
今晚面试题
1.Python 是强语言类型还是弱语言类型?
2.a=1,b=2,不用中间变量交换 a 和 b 的值?
3.Python2 中 range 和 xrange 的区别?
4.以下 Python 程序的输出?
for i in range(5,0,-1):
print(i)
5.read、readline 和 readlines 的区别?
6.有大小写字母的字符串,要求是如果字符串中大写字母的数量小于等于小写字母的数量,则把字符串全部变小写,反之则将字符串全部变为大写
#python
#示例
# solve('coDe')——>>'code'
# solve('CODe')——>>'CODE'
7.现有字典 d={‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按字典中的 value值进行排序?
8.将字符串"k:1|k1:2|k2:3|k3:4",处理成 Python 字典:{‘k’:1, ‘k1’:2, ... }
9.请用迭代器实现斐波那契数列?
简单地说,起始两项为 0 和 1,此后的项分别为它的前两项之和
10.请用递归的方式打印出下列数据类型中每一个元素
#python l = [1,[2,[3,[4,[5,[6,[7,[8,[9]]]]]]]]]