1. 函数名的运用
你们说一下,按照你们的理解,函数名是什么?
函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值;但是作为函数名他也有特殊的功能就是加上()就会执行对应的函数,所以我们可以把函数名当做一个特殊的变量,那么接下来,我们就来研究一下这个特殊的变量。
1.1 函数的内存地址
def func(): print("呵呵") print(func)结果: <function func at 0x1101e4ea0>
通过上面代码可以我们知道,函数名指向的是这个函数的内存地址,其实深一步理解可得知,与其说函数名()可以执行这个函数,不如说是函数的内存地址()才是执行这个函数的关键,就好比:
a = 1 b = 2 c = a + b print(c) # 3
a + b 并不是变量的相加,而是 两个变量指向的int对象的相加。
1.2 函数名可以赋值给其他变量
如果你理解了第一条,那么第二条就更容易的理解了:
def func(): print("呵呵") print(func) a = func # 把函数当成一个变量赋值给另一个变量 a() # 函数调用 func()
通过变量的赋值,变量a,和变量func都指向的这个函数的内存地址,那么a() 当然可以执行这个函数了。
1.3 函数名可以当做容器类的元素
其实这个也不难理解,函数名就是一个变量,我的变量是可以当做容器类类型的元素的:
a = 1 b = 'alex' c = '武sir' l1 = [a, b, c] for i in l1: print(i) ''' # 结果: 1 alex 武sir '''
那么函数名也是可以的:
def func1(): print("in func1: 嘻嘻") def func2(): print("in func2: 哈哈") def func3(): print("in func3: 咯咯") def func4(): print("in func4: 吱吱") lst = [func1, func2, func3, func4] for i in lst: i()
1.4 函数名可以当做函数的参数
变量可以做的,函数名都可以做到。
def func1(): print('in func1') def func2(f): print('in func2') f() func2(func1)
1.5 函数名可以作为函数的返回值
def func1(): print('in func1') def func2(f): print('in func2') return f ret = func2(func1) ret() # ret, f, func1 都是指向的func1这个函数的内存地址
小结:函数名是一个特殊的变量,他除了具有变量的功能,还有最主要一个特点就是加上() 就执行,其实他还有一个学名叫第一类对象。
2 Python新特性:f-strings格式化输出
f-strings 是python3.6开始加入标准库的格式化输出新的写法,这个格式化输出比之前的%s 或者 format 效率高并且更加简化,非常的好用,相信我,你们学完这个之后,以后再用格式化输出这就是你们唯一的选择。
2.1 简单举例
他的结构就是F(f)+ str的形式,在字符串中想替换的位置用{}展位,与format类似,但是用在字符串后面写入替换的内容,而他可以直接识别。
name = '太白金星' age = 18 sex = '男' msg = F'姓名:{name},性别:{age},年龄:{sex}' # 大写字母也可以 msg = f'姓名:{name},性别:{age},年龄:{sex}' print(msg) ''' 输出结果: 姓名:太白金星,性别:18,年龄:男 '''
2.2 任意表达式
他可以加任意的表达式,非常方便:
print(f'{3*21}') # 63 name = 'barry' print(f"全部大写:{name.upper()}") # 全部大写:BARRY # 字典也可以 teacher = {'name': '太白金星', 'age': 18} msg = f"The teacher is {teacher['name']}, aged {teacher['age']}" print(msg) # The comedian is 太白金星, aged 18 # 列表也行 l1 = ['太白金星', 18] msg = f'姓名:{l1[0]},年龄:{l1[1]}.' print(msg) # 姓名:太白金星,年龄:18.
2.3 也可以插入表达式
可以用函数完成相应的功能,然后将返回值返回到字符串相应的位置
def sum_a_b(a,b): return a + b a = 1 b = 2 print('求和的结果为' + f'{sum_a_b(a,b)}')
2.4 多行f
name = 'barry' age = 18 ajd = 'handsome' # speaker = f'''Hi {name}. # You are {age} years old. # You are a {ajd} guy!''' speaker = f'Hi {name}.' f'You are {age} years old.' f'You are a {ajd} guy!' print(speaker)
2.5 其他细节
这里有一些注意的细节,了解一下就行。
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
总结:f-string的格式化输出更加简洁,方便,易读。而且他的处理速度对之前的%s 或者format 有了较高的提升,所以可以使用此种格式化输出。