####################### 函数递归 ###################################
# 函数递归调用其实就是自己调用自己,关键点只要考虑什么时候跳出即可(没有跳出就是死循环)
# 阶乘案例 n!
def factorial(n):
if n==1:
return n #跳出
elif n>1:
return n*factorial(n-1) #规律公式
print(factorial(4))
print(factorial(-4))
24 None
# 利用切片操作,实现一个trim()函数,去除字符串首尾的空格
# 跳出点==> 第一个字符和最后一个字符不是空格
def my_trim(input_str):
if input_str[0] != " " and input_str[-1] != " ":
return input_str
elif input_str[0]==" ":
return my_trim(input_str[1:])#从第二个到最后一个字符
elif input_str[-1]==" ":
return my_trim(input_str[:-1])#从第一个到倒数第二个(end_index取不到)
print(my_trim("我去 "))
print(my_trim(" 我去"))
print(my_trim(" 我去 "))
我去 我去 我去
####################### 匿名函数 ###################################
# Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数
# lambda 参数: 表达式
# 来个简单求和案例:
sum=lambda a,b: a+b
sum(1,2) #调用一下看看(有点js的感觉,函数可以直接赋值给变量,然后直接用)
3
# 来个实际案例,还记得list的排序吗?
# 这次按照指定key排序(有点 SQL 里面 order by 的感觉)
data_list=[
{"name":"a张三","age":21},
{"name":"b李四","age":23},
{"name":"a王五","age":22}]
help(data_list.sort)
Help on built-in function sort: sort(...) method of builtins.list instance L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*
# 按照age排序
data_list.sort(key=lambda x:x["age"])
print(data_list)
# 按照name排序
data_list.sort(key=lambda x:x["name"])
print(data_list)
[{'name': 'a张三', 'age': 21}, {'name': 'a王五', 'age': 22}, {'name': 'b李四', 'age': 23}] [{'name': 'a张三', 'age': 21}, {'name': 'a王五', 'age': 22}, {'name': 'b李四', 'age': 23}]
# 当函数的参数传递(有时候需要传一个匿名方法去函数中处理某些事情)
def sum(a,b,func):
return func(a,b)
sum(1,2,lambda x,y: x+y)
3
####################### 全局变量 ###################################
# 有人可能会说,这个就太简单了,没啥好说的,(⊙o⊙)… Python还真需要说说
a=100
b=[1,2]
def set_num(num):
num+=num
set_num(a)
set_num(b)
# 发现全局变量a木有被修改,而b修改了
print(a)
print(b)
100 [1, 2, 1, 2]
# 还是来个简单案例说明下吧~
a=100
def set_num(num):
a=200
set_num(a)
print(a)
100
# 这是因为,python定义一个变量的写法不用加类型导致的(⊙﹏⊙) 所以函数里面a=200,python解释器就认为你
# 定义了一个和a这个全局变量名字相同的局部变量,那怎么用呢?global来声明一下即可
a=100
def set_num(num):
global a
a=200
set_num(a)
print(a)
200
# 在函数中不使用global声明全局变量不能修改全局变量==>本质是不能修改全局变量的指向,即不能将全局变量指向新的数据
# 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量
# 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量
####################### 验证系列 ###################################
# 之前很多资料说py3匿名函数里不能调用print函数,自己测试下
# 定义一个无参匿名函数
printf=lambda:print("I Love You")
printf()
I Love You
# 可变类型与不可变类型的变量分别作为函数参数的区别
# 感到疑惑可以看之前的运算符扩展(https://www.cnblogs.com/dotnetcrazy/p/9155310.html#ext)
def default_some_params(nums):
nums+=nums
test_num=1
default_some_params(test_num)
test_num
1
test_list=list(range(1,6))
default_some_params(test_list)
test_list
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
# Python中函数参数是引用传递
# 对于不可变类型,因变量不能修改,所以运算不会影响到变量自身
# 而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量
# 函数名能不能重复的问题(能不能重载:具有不同的参数的类型或参数的个数)
def test():
pass
def test(a,b):
return a+b
test(1,2)
3
test() #前一个直接被后一个覆盖掉了
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-29-023d21616394> in <module>() ----> 1 test() #前一个直接被后一个覆盖掉了 TypeError: test() missing 2 required positional arguments: 'a' and 'b'
# 来两个有趣的扩展:
# 1.交换两个数熟悉吧,编程第一课,除了用第三变量 或者 两数相加减 实现外,Python还有一种新方式:
a,b=2,3
a,b=b,a
print(a)
print(b)
3 2
# 2.eval(和js里面的eval差不多):
input_str=input("请输入:")
print(input_str)
eval(input_str)
请输入:print("厉害") print("厉害") 厉害