python基础 (三)
真心觉得python这门语言是业界良心:
- 函数语法与特性
- 局部变量与参数
- 返回值
- 嵌套函数
- 递归
- 匿名函数
- 高阶函数
- 内置函数
一、函数语法与特性
函数:将一组语句的集合通过一个函数名封装起来,若想执行该函数,调用其函数名
一般语法:
def hello(*args,**kwargs):
...
return ...
参数和返回值视情况而存在
特性:
- 减少重复代码
- 可扩展
- 易维护
二、 局部变量与参数
实参:在函数调用时,必须具有确定的值,以便传递给函数的形参,因此必须预先定义,可以是常量、变量、表达式、函数等
形参:只有在调用时才分配内存单元,结束后立即释放,因此只在函数内部有效
def test(x,y):#x,y是形参
return x+y
a=test(w,z)#w,z是实参
下面介绍几种形参:
def actor_info(name,sex,magnum_opus,country="中国"):#country是默认参数
print("""
----------{name} info-----------
姓名: {name}
性别: {sex}
代表作: {magnum_opus}
国籍: {country}""".format(name=name,sex=sex,magnum_opus=magnum_opus,country=country))
actor_info("赵丽颖","女","花千骨")
1、位置参数
按顺序依依传入。
actor_info("赵丽颖","女","花千骨")
2、关键参数
当给函数传参数时不想按顺序来,那么可以用指定参数名的关键参数,关键参数一定要在位置参数的后面不然就乱了,代码中magnum_opus和sex就是关键参数,不用考虑自身位置。
actor_info("赵丽颖",magnum_opus="花千骨",sex="女")
3、默认参数
这里country就是默认参数,调用时不需指定,若指定了就是指定的值,默认参数可看作特殊情况的位置参数,必须放在最后不打扰其他参数。
actor_info("赵丽颖","女","花千骨")
4、非固定参数
如果函数定义时不明确要传入多少参数,那么使用非固定参数。
args:将多传入的位置参数构造成一个元组。
def actor_info(name,*args,country="中国"):
print("""
----------{name} info-----------
姓名: {name}
性别: {sex}
代表作: {magnum_opus}
国籍: {country}""".format(name=name,sex=args[0],magnum_opus=args[1],country=country))
actor_info("赵丽颖","女","花千骨")
**kwargs:将多传入的关键参数构造成一个字典。
def actor_info(name,*args,**kwargs):
print(name,args,kwargs)
actor_info("赵丽颖","女",magnum_opus="花千骨",country="中国")
#输出
#赵丽颖 ('女',) {'country': '中国', 'magnum_opus': '花千骨'}
全局变量:在程序一开始就定义的变量称为全局变量,其作用域是整个程序
局部变量:在子程序中定义的变量称为局部变量,其作用域是定义该变量的子程序
局部变量:
age=48
print("你几岁啊")
def liar(age):
age=18
print("I am %s years old"%age)
liar(age)
print("其实真实年龄是%s"%age)
输出:
你几岁啊
I am 18 years old
其实真实年龄是48
因此当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用,在其他地方都是全局变量起作用。
三、返回值
函数的执行结果可以用return语句返回。
pay attention please!
- 函数执行过程中遇到return语句立即停止并返回结果,表征函数的结束
- 若函数中未指定return,那么返回值为None
四 、嵌套函数
函数还能嵌套函数,嵌套的子函数不能被外部程序调用,它是局部变量
depth=3
def yangcong():
depth=2
def yangcong2():
depth=1
print("你正在剥第%s层洋葱"%depth)
yangcong2()
print("你正在剥第%s层洋葱"%depth)
yangcong()
print("你正在剥第%s层洋葱"%depth)
输出:
你正在剥第1层洋葱
你正在剥第2层洋葱
你正在剥第3层洋葱
五 、递归
嵌套函数是在函数中调用其他局部函数,那么在函数中调用自身就是递归函数。
def cal(n):
if n==1:
return n
return n*cal(n-1)
cal(5)
#输出
#120
主要特性:
- 必须有一个明确的结束条件
- 每次进入更深一层递归,问题规模比前一次有所减少
- 函数调用是通过栈来实现的,每执行一个函数调用就会增加一层栈,函数返回结束时会减少一层栈,因此递归调用次数过多,会引起栈溢出
递归函数还可用于对有序列表二分查找:
num_list=[2,5,7,9,12,15,19,25,29,36,38,46,89]
def binary_search(num_list,num):
if len(num_list)>1:
mid=int(len(num_list)/2)
if num_list[mid] == num:
print("find it!")
elif num_list[mid]>num:
return binary_search(num_list[:mid],num)
else:
return binary_search(num_list[mid+1:],num)
else:
if num_list[0] == num:
print("find it!")
else:
print("真是找不到啊!")
binary_search(num_list,9)
#输出
#find it!
六、匿名函数
匿名函数不要按照常规方式明确的取指定一个函数。
#常规定义
def test(n):
return n*n
#匿名函数定义
test=lambda n:n*n
匿名函数需要和其他函数搭配使用,比如map函数:
data=map(lambda n:n*n,[5,4,6,3])
for i in data:
print(i)
#输出
#25
#16
#36
#9
七、高阶函数
函数定义的参数中包含一个指向函数的变量,那么这个函数称作高阶函数。
def square(n):
return n**2
def sub(a,b,func):
return func(a)-func(b)
sub(5,3,square)
#输出
#16
八、内置函数
python解释器内含许多函数和数据类型。
具体参考python官方网页:https://docs.python.org/3/library/functions.html?highlight=built#ascii