函数第一类方法f-string格式化迭代器及递归函数

Posted lifangzheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数第一类方法f-string格式化迭代器及递归函数相关的知识,希望对你有一定的参考价值。

函数第一类方法、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))

技术图片

以上是关于函数第一类方法f-string格式化迭代器及递归函数的主要内容,如果未能解决你的问题,请参考以下文章

第一类对象(函数),闭包及迭代器

迭代器 递归 格式化

原始递归函数

Python入门教程第77篇 格式化字符串F-strings

装饰器生成器迭代器及python中内置函数的使用

迭代器及生成器