Python学习(九)——函数、递归、格式化输出
本文介绍了函数、递归、格式化输出的知识,仅作为本人学习时记录,感兴趣的初学者可以一起看看,欢迎评论区讨论,一起加油鸭~~~
心中默念:Python 简单好学!!!
(有其他编程语言基础,所以记录的可能对初步接触编程的同学不太友好,有问题欢迎留言)
函数
函数的定义
使用关键字def
确定函数名称、参数名称、参数个数、编写函数体(用于实现函数功能的代码)
- 通过函数名称进行调用函数
- 定义好函数之后,只表示这个函数封装了一段代码而已
- 如果不主动调用函数,函数是不会主动执行的
函数的参数
- 形参:函数定义时小括号里的参数,是用来接收参数用的,在函数内部作为变量使用
- 实参:函数调用的时候,小括号里的参数,是用来把数据传递到函数内部用的
- 函数可以没有形参和实参
- 默认参数:缺省参数
- 可变参数
示例程序
def f():print('hello')
f()def sum_2(a,b): # 形式参数print(a + b)
sum_2(3,2) # 实际参数def power(x, n = 2): # n:默认参数,缺省参数return x ** na = power(4,3)
b = power(6)
print(a,b)
a = int('16',8)
print(a)def infos(name,age = 24,gender = '女'):return '大家好,我叫%s,我今年%d岁,我是一名%s生' % (name,age,gender)
lily = infos('mia',24,'女')
jack = infos('jack',gender='男')
print(lily)
print(jack)# 可变参数
def total(*a): # 可变参数print(a)print(type(a))result = 0for i in a:result += ireturn result
result = total(1,2,4,6,7,1)
print(result)def f(**kwargs): # 可变参数,接收字典for k,v in kwargs.items():print(k,v)
d = {'name':'Xiaoming','age':18}
f(**d)
变量作用域
- 局部变量:是在函数内部定义的变量,只能在函数内部使用
- 全局变量:是在函数外部定义的变量,所有函数内部都可以使用这个变量
# 全局变量
num1 = 10 # 不可变数据类型
list1 = [1,2,3,4,5] # 可变数据类型def f():global num1 # 声明在f中使用的num1是全局变量num1num2 = 20 # 局部变量num1 = 20 # 未进行global声明前,只是创建了一个同名的变量,对全局实际不生效list1[2] = 8print('在函数f中打印num1的值',num1)print('在函数f中打印list1的值', list1)print('num2的值',num2)print('num1的值',num1)
f()
# print('在函数f外打印变量num2的值',num2) # 局部变量不能在函数外使用
print('在函数f执行后打印num1的值',num1)
print('在函数f执行后打印list1的值', list1)
匿名函数
lambda函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方。
优点:让代码更加精简,不需要考虑命名的问题
示例代码
# fun = lambda a,b:a+b
# result = fun(1,2)
# print(result)# map 映射
a = [1,2,3,4,5]
result = map(lambda x:x ** 2, a)
print(list(result))# reduce 累积
from functools import reduce
result = reduce(lambda x,y:x+y,a)
print(result)# filter 过滤
result = filter(lambda x:x % 2 ==0, a)
print(list(result))a = [1,2,3,40,5,6,0,6,0,5] # 12340560605
result = filter(lambda x:x != 0,a)
print(list(result))result = 0
mul = 1
for i in a[::-1]:result = result + i * mulmul = mul * 10 ** len(str(i))
print(result)result = reduce(lambda x,y:x*10**len(str(y))+y,a)
print(result)
内置函数
递归函数
- 一个函数调用自身称为递归调用
- 一个会调用自身的函数称为递归函数
递归的过程
- 写出临界条件
- 找这一次和上一次的关系
- 假设当前函数已经能用,调用自身计算上一次结果,再求出本次结果当参数满足一个条件时,函数不再执行
示例代码
# 10阶楼梯,每次上1个台阶或者上2个台阶,问一共有多少种走法
# 3
# 1 1 1
# 1 2
# 2 1# n=0,f(n)=0;
# n=1,f(n)=1;
# n=2,f(n)=2;
# n=3,f(3)=3;
# n=4,f(n)=5;
# n=5,f(n)=8;
def f(n): # 计算出n阶楼梯,一共有多少种走法if n == 0:return 0elif n == 1:return 1elif n == 2:return 2else:return f(n-1) + f(n-2)m = int(input('请输入n'))
print(f(m)) # 使用递归方式效率较低,不建议a = [0,1,2]
for i in range(11):a.append(a[i+1]+a[i+2])
print(a[11])
格式化输出
f-strings与%
f-strings (f-字符串) 和旧式的 % 格式化字符串在功能上都能实现字符串格式化,但它们在语法、可读性和性能方面存在显著差异:
语法
f-strings: 使用 f 前缀和花括号 {} 来嵌入表达式。 表达式直接写在花括号内,无需任何额外的格式化字符。例如:
name = "Alice"
age = 30
print(f"My name is {name} and I am {age} years old.")
% 格式化: 使用 % 运算符,并在字符串中使用 %s、%d、%f 等占位符来表示不同类型的变量。 变量通过一个元组或字典传递给 % 运算符。例如:
name = "Alice"
age = 30
print("My name is %s and I am %d years old." % (name, age))
可读性
f-strings: 更易于阅读和理解,因为表达式直接嵌入在字符串中,无需查找占位符与变量之间的对应关系。 特别是当字符串较长或包含多个变量时,f-strings 的可读性优势更为明显。
% 格式化: 可读性较差,特别是当有多个变量时,需要仔细检查占位符和变量的顺序。
表达式复杂度
f-strings: 支持在花括号内使用任意有效的Python表达式,包括函数调用、算术运算等。 这使得f-strings 能够处理更复杂的格式化需求。例如:
import math
radius = 5
print(f"The area of the circle is {math.pi * radius**2}")
% 格式化: 仅支持简单的变量替换,不支持在占位符内进行复杂的计算。
性能
f-strings: 通常比 % 格式化和 .format() 方法更快,因为它们在编译时进行格式化,而不是在运行时。
% 格式化: 在运行时进行格式化,性能相对较慢,尤其是在处理大量数据时。
可维护性
f-strings: 更易于维护,因为变量名称直接在字符串中可见,修改时更容易定位。
% 格式化: 修改时需要同时修改字符串中的占位符和变量的顺序,容易出错。
总结
f-strings 是现代 Python 中推荐的字符串格式化方法,因为它更简洁、更易读、更易于维护,并且性能更好。 % 格式化方法现在已经过时,不推荐在新的代码中使用。 .format() 方法是 % 方法的改进版,比 % 方法稍好,但仍然不如 f-string 方便和高效。