函数第一类方法、f-string格式化、迭代器及递归函数
函数第一类方法
- 函数名可以赋值给其他变量
def func():
print(1)
a = func
a()
# 结果:1
- 函数名可以当做容器类的元素
def func1():
print(1)
def func2():
print(2)
def func3():
print(3)
for i in [func1,func2,func3]:
i()
# 结果:
1
2
3
- 函数名可以当做函数的参数
def func():
print(1)
def func1(f):
print('我是传递过来的函数')
f()
func1(func)
# 结果:
'我是传递过来的函数'
1
- 函数名可以作为函数的返回值
def func():
def foo():
a = 1
print(a)
return foo
ret = fun()
ret()
# 结果:
1
f-string字符串格式化
支持:F,变量,数字计算,表达式,函数,列表取值,字典取值
s = f"你好{'赛丽亚'}" # 填充字符串
s1 = F"你好{'赛丽亚'}"
print(s)
print(s1)
# 结果:
你好赛丽亚
你好赛丽亚
s = '世界'
s1 = f"你还是挺好的{s}" # 填充变量
print(s1)
s1 = f"{35+15}" # 填充计算公式
print(s1)
a = 10
b = 20
s1 = f"{a if a>b else b}" # 填充表达式
print(s1)
def foo():
def func():
a = 1
return a
return func()
s1 = f"{foo()}" # 填充函数
print(s1)
lst = [1,3,4,5,6]
s1 = f"{lst[0:5]}" #填充列表
print(s1)
dic = {"key1":123,"key2":345}
s1 = f"{dic['key2']}" #填充字典
print(s1)
print(f"{{73}}") # {73}
print(f"{{{73}}}") # {73}
print(f"{{{{73}}}}") # {{73}}
m = 21
# ! , : { } ;这些标点不能出现在{} 这里面。
# print(f'{;12}') # 报错
# 所以使用lambda 表达式会出现一些问题。
# 解决方式:可将lambda嵌套在圆括号里面解决此问题。
x = 5
print(f'{(lambda x: x*2) (x)}') # 10
迭代器
可迭代对象
在python中,但凡内部含有iter方法的对象,都是可迭代对象。
a = 'alex'
print(dir(a))
# 结果:
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
简单的方法:
a = 'alex'
print('__iter__' in dir(a))
# 结果:
True
我们平时用到的list 、str、tuple、dict、set都是可迭代对象
可迭代对象的优点:
- 方便取值,比较直观
- 占用内存
迭代器
迭代器的定义:
从字面意思来看,迭代器就是可以迭代取值的工具。
从专业角度来说:迭代器是这样的对象:实现了无参数的__next__方法,返回序列中的下一个元素,如果没有元素了,那么抛出StopIteration异常.python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代。
我们常见数据类型list、str、dict、tuple、set及文件句柄,只有文件句柄是迭代器
o1 = 'alex'
o2 = [1, 2, 3]
o3 = (1, 2, 3)
o4 = {'name': '李白','age': 18}
o5 = {1, 2, 3}
f = open('file',encoding='utf-8', mode='w')
print('__iter__' in dir(o1)) # True
print('__iter__' in dir(o2)) # True
print('__iter__' in dir(o3)) # True
print('__iter__' in dir(o4)) # True
print('__iter__' in dir(o5)) # True
print('__iter__' in dir(f)) # True
print('__next__' in dir(o1)) # False
print('__next__' in dir(o2)) # False
print('__next__' in dir(o3)) # False
print('__next__' in dir(o4)) # False
print('__next__' in dir(o5)) # False
print('__next__' in dir(f)) # True
f.close()
迭代对象转化为迭代器:
lst = list(range(6))
lst1 = lst.__iter__()
print(lst1)
# 结果:<list_iterator object at 0x000001C68FCA87B8>
lst = list(range(6))
lst1 = iter(lst)
print(lst1)
# 结果:<list_iterator object at 0x00000211B7048780>
**迭代器取值(使用__next__方法):**
lst = list(range(3))
lst1 = lst.__iter__()
ret = lst1.__next__()
print(ret) # 0
ret = lst1.__next__()
print(ret) # 1
ret = lst1.__next__()
print(ret) # 2
ret = lst1.__next__()
print(ret) # StopIteration
# 迭代器利用next取值:一个next取对应的一个值,如果迭代器里面的值取完了,还要next,那么就报StopIteration的错误。
while模拟for的内部循环机制:
lst = list(range(5))
count = len(lst)
lst_s = lst.__iter__()
while count:
print(lst_s.__next__())
count -= 1
# 郭氏原理
lst = list(range(5))
lst_s = lst.__iter__()
while True:
try:
print(lst_s.__next__())
except StopIteration:
print('迭代终止')
递归函数
有效递归的两个条件:
- 不断的调用自己本身
- 有明确的终止条件
def age(n):
if n == 1:
return 18
else:
return age(n-1)+2
print(age(3))
原文地址:https://www.cnblogs.com/lifangzheng/p/11209405.html
时间: 2024-10-23 16:26:20