1 def recursion(i): #定义函数
2 print(i)3 if i/2 > 1: #判断递归条件,退出
4 re = recursion(i/2) #递归函数自身
5 print('返回值:',re)6 print('上层递归值:',i)7 return i #返回值
8 recursion(10)9
10
11 """
12 运行原理:首先运行函数传参10给函数,打印10,判断条件是否满足,
满足递归函数参数值为(10/2)5,打印i的值5,等递归到1.25时,判断条件不满足后,
才打印上层递归的值,此时的值为1.25,return递归最后一层的值1.25,退出最后一层递归,
继续一层层退出递归,最后返回最上层递归值结束函数。13
14 """
15
16 #输出结果为:
17 10
18 5.0
19 2.5
20 1.25
21 上层递归值: 1.25
22 返回值: 1.25
23 上层递归值: 2.5
24 返回值: 2.5
25 上层递归值: 5.0
26 返回值: 5.0
27 上层递归值: 10
python二分算法:
二分算法是能够更高效解决问题的方法:
二分查找操作的数据集必须是一个有序的数据集。开始时,先找出有序集合中间的那个元素。如果此元素比要查找的元素大,就接着在较小的一个半区进行查找;反之,如果此元素比要找的元素小,就在较大的一个半区进行查找。在每个更小的数据集中重复这个查找过程,直到找到要查找的元素或者数据集不能再分割。
二分查找能应用于任何类型的数据,只要能将这些数据按照某种规则进行排序。然而,正因为它依赖于一个有序的集合,这使得它在处理那些频繁插入和删除操作的数据集时不太高效。这是因为,对于插入和操作来说,为了保证查找过程正常进行,必须保证数据集始终有序。相对于查找来说,维护一个有序数据集的代价更高。此外,元素必须存储在连续的空间中。因此,当待搜索的集合是相对静态的数据集时,此时使用二分查找是最好的选择。
二分算法实质上是不断地将有序数据集进行对半分割,并检查每个分区的中间元素。
#二分法查找要求:查找序列必须是有序序列#查找156在lst中的位置
lst = [1, 4, 5, 6, 8, 9, 11, 15, 17, 18, 19, 45, 49, 98, 101, 156, 178, 199]defbinary_search(lst, n, left, right):if left >right:print("没有这个数")return -1middle= (left + right) // 2
if n
right= middle - 1
elif n >lst[middle]:
left= middle + 1
else:returnmiddlereturnbinary_search(lst, n, left, right)
left=0
right= len(lst) - 1
print(binary_search(lst, 156, left, right)) #15 查找的156在列表的第15位。
python三元表达式:
使用一行代码快速判断,替换复杂的多行if语句,使得代码简单可维护。
"""三元表达式固定表达式
值1 if 条件 else 值2
条件成立 值1
条件不成立 值2"""
#普通模式判断大小:
x=2y=3
if x >y:print(x)else:print(y)#三元表达式比大小
x = 2y= 3res= x if x > y elseyprint(res)
python列表生成式:
列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式。列表生成式的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。列表表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表,在这个以if和for语句为上下文的表达式运行完成之后产生。运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
#生成[1x1, 2x2, 3x3, ..., 10x10]
#不用列表生成式:
l =[]for x in range(1, 11):
l.append(x*x)print(l) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#使用列表生成式:
l =[]
res= [x * x for x in range(1, 11)]print(res) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
"""先for循环依次取出列表里面的每一个元素
然后交由if判断 条件成立才会交给for前面的代码
如果条件不成立 当前的元素 直接舍弃"""
python字典生成式:
#例:
my_dict = {"a": 1, "b": 2, "c": 3}print(my_dict) #{'a': 1, 'b': 2, 'c': 3}
匿名函数:
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:有些函数在代码中只用一次,而且函数体比较简单,使用匿名函数可以减少代码量,匿名函数是没有名字的函数,它的特点是临时存,用完就没了。
#普通函数:
defcalc(x,y):return x**yprint(calc(x=2,y=5))#换成匿名函数
calc = figure x,y:x**yprint(calc(2,5))
函数的常用的内置方法:简单的提一下:
abs():
绝对值函数。如abs(-1)= 1
#参数:#x -- 数值表达式,可以是整数,浮点数,复数。
#返回值:#函数返回 x(数字)的绝对值,如果参数是一个复数,则返回它的大小。
>>> abs(-10)10
>>> f =abs>>> f(-1)1
>>> abs=id>>> abs(1)1869788224
"""以abs()函数为例,展示两个特性。一是,内置函数是可以被赋值给其他变量的,
同样也可以将其他对象赋值给内置函数,这时就完全变了。所以,内置函数不是
Python关键字,要注意对它们的保护,不要使用和内置函数重名的变量名,这
会让代码混乱,容易发生难以排查的错误。"""