码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-07-18 19:49:29      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:join   __add__   hook   解决   python   mamicode   func   ide   alpha   

函数第一类方法、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格式化、迭代器及递归函数

标签:join   __add__   hook   解决   python   mamicode   func   ide   alpha   

原文地址:https://www.cnblogs.com/lifangzheng/p/11209405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!