递归函数
函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身
在调用f1的过程中,又调用f1,这就是直接调用函数f1本身
def func():
print('from func')
func()
func()
在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接调用函数f1本身
def f1():
print('from f1')
f2()
def f2():
print('from f2')
f1()
f1()
从上图可以看出,两种情况下的递归调用都是一个无限循环的过程,但在python对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,要避免出现这种情况,就必须让递归调用在满足某个特定条件下终止。
#1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用
sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制
#2. python不是一门函数式编程语言,无法对递归进行尾递归优化。
递归的实例1
问:A的年龄比B大2岁,B的年龄比C大2岁,C的年龄比D大2岁,D的年龄比E大2岁 已知E=18岁,求A的年龄?
def age(n):
if n == 1:
return 18
return age(n - 1) + 2
ret = age(5)
print(ret)
递归的实例2
打印出列表l的所有数字?
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, ]]]]]]]]]]]]]]
l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, ]]]]]]]]]]]]]]
def lis_num(l):
for a in l:
if type(a) is int:
print(a)
else:
lis_num(a)
lis_num(l)
递归的实例2
遍历 D:/文件夹, 打印出所有的文件和普通文件的文件名
import os
def func(filepath,n): # d:/sylar/
# 1,打开这个文件夹
files = os.listdir(filepath)
# print(files)
# 2. 拿到每一个文件名
for file in files: # 文件名
# 3. 获取到路径
f_d = os.path.join(filepath, file) # d:/sylar/文件名/
# print( f_d)
if os.path.isdir(f_d):
print("\t"*n,file)
func(f_d,n+1)
else:
print("\t"*n,file)
func("F:\新项目",0)
二分法
⼆分查找. 每次能够排除掉⼀半的数据. 查找的效率非常⾼. 但是局限性比较⼤. 必须是有 序序列才可以使⽤⼆分查找 要求: 查找的序列必须是有序序列.
l = [11, 2, 3, 43, 55, 67, 23, 45, 45, 88, 99, 66,100]
l.sort()
print(l) #[2, 3, 11, 23, 43, 45, 45, 55, 66, 67, 88, 99,100]
target_num =88
def my_half(ll):
if len(ll) == 0:
print('没找到5')
return
t = len(ll) // 2
if target_num>ll[t]:
n_l = ll[t+1:]
my_half(n_l)
elif target_num < ll[t]:
n_l = ll[:t]
my_half(n_l)
else:
print("找到了")
my_half(l)
三元表达式
Python的三元表达式是一种非常简洁的语法结构,可以用于在给定条件下选择两个可能的结果之一。它的基本语法格式如下:
pythonvalue_if_true if condition else value_if_false
其中,condition
是要进行判断的条件表达式,value_if_true
和value_if_false
是在条件为真或假时返回的值。
与if-else语句相比,三元表达式的优点在于语法更加简洁,可以更加快速地编写代码。在执行时,如果条件为真,则返回value_if_true
的值,否则返回value_if_false
的值。
需要注意的是,虽然三元表达式在某些情况下可以加快代码的执行速度,但在大多数情况下,它的执行速度与if-else语句相比并没有明显的优势。因此,在选择使用三元表达式还是if-else语句时,应该根据代码的可读性和简洁性来做出决策,而不是仅仅考虑执行速度。
def my_max(a, b):
return a if a > b else b
print(my_max(10, 50))
res = '不出去玩' if '下雨' else '出去玩'
print(res) # 不出去玩
res = '扯淡' if 2 > 10 else 10
print(res)
res = 2 if 2>10 else ( 10 if False else (100 if 10 > 5 else (2 if False else 1)))
print(res)
列表生成式
Python的列表生成式是一种简洁而强大的方式来创建列表。它使用一个表达式来生成列表的元素,通常与for循环一起使用。
下面是一个简单的示例,演示如何使用列表生成式创建一个包含1到10平方数的列表:
pythonsquares = [x**2 for x in range(1, 11)]
print(squares)
输出:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
在上面的代码中,[x**2 for x in range(1, 11)]
是一个列表生成式,它使用for循环迭代范围为1到10的数字,对每个数字进行平方操作,并将结果添加到列表中。
您还可以在列表生成式中使用多个表达式和条件语句来实现更复杂的逻辑。以下是一个示例,演示如何使用列表生成式从1到100的数字中筛选出偶数,并将其平方:
pythoneven_squares = [x**2 for x in range(1, 101) if x % 2 == 0]
print(even_squares)
输出:
[4, 16, 36, 64, 100, 144, 196, 256, 324, 400, ..., 96496]
在上面的代码中,[x**2 for x in range(1, 101) if x % 2 == 0]
是一个列表生成式,它使用for循环迭代从1到100的数字,对每个数字进行平方操作,同时使用条件语句if x % 2 == 0
来筛选出偶数
names_list = ['kevin', 'jerry', 'tank', 'oscar']
a = [name + "_sb" for name in names_list]
print(a) #['kevin_sb', 'jerry_sb', 'tank_sb', 'oscar_sb']
a = [name + "_sb" for name in names_list if name!="kevin"]
print(a) #['jerry_sb', 'tank_sb', 'oscar_sb']
a = [name + "_sb" if name!="jerry" else name for name in names_list ]
print(a) #['kevin_sb', 'jerry', 'tank_sb', 'oscar_sb']