1.函数
之前接触过的一些函数
print / bin / oct / is / str / int
函数的特点与作用
(1)实现某一功能
(2)隐藏内部实现细节
(3)避免重复代码
1.1函数的参数
# 函数定义的格式
def my_fun():
pass
# 函数的参数
# 必须参数
def my_func_with_param(p1,p2):
print(p1,p2)
my_func_with_param(1,2)
'''
形参:形式参数,它只是意义上的一种参数,在定义的时候不占内存地址。
实参:实实在在的参数,是实际占用内存地址的。
'''
# 关键字参数:是在调用的时候制定参数名称,可以不按照顺序传参数。
def my_func_with_param(name,age):
print(name + "来了,他今年" + str(age) + "岁!") # age必须类型转换成字符型,否则报错
my_func_with_param(name = "老王",age = 50) # 关键字参数,指定数据。
# 默认参数 如果调用者没有船只,那么就用默认值,可以不指定名字
def my_func_with_param(name = "小杨",age = 22):
print(name + "来了,他今年" + str(age) + "岁!")
my_func_with_param()
# 参数混合使用
# 混合使用时,非默认参数必须在默认参数的前面
def my_func_with_param(name,age = 22):
print(name + "来了,他今年" + str(age) + "岁!")
my_func_with_param(name = "小杨")
1.2函数的返回值
'''
函数的返回值
'''
def func_with_return():
print("函数被调用") # 没有返回值
p = func_with_return()
print(p)
print(type(p)) # 打印p的类型,输出应该是'NoneType'
def func_with_return(p):
return p
p = func_with_return(5)
print(p)
print(type(p)) # 打印p的类型,输出应该是'int'
def func_with_return(p):
return p
p = func_with_return("python")
print(p)
print(type(p)) # 打印p的类型,输出应该是'str'
# 多个返回值
def func_with_return(name,age):
return name,age
n,a = func_with_return("小杨同学",22) # 此处用两个参数接该函数的返回值
print(n,a)
def func_with_return(name,age):
return name,age
s = func_with_return("小杨同学",22) # 此处用一个参数接该函数的返回值
print(s)
输出结果
对比以上两个输出结果
当用一个参数来接函数的返回值时,输出结果为小括号形式,即元组(元组用小括号表示)。
# 返回一个函数
def func_with_return2(x):
if x == 2:
def inner_func(y):
return y * y
if x == 3:
def inner_func(y):
return y * y * y
return inner_func # 此处返回内函数
calc = func_with_return2(3) # 调用函数
print(calc(4)) # 计算4的立方
2.递归
在函数中,自己调用自己
重点:要明确递归结束的条件
优点:写法非常简洁
缺点:效率低
要求:每次递归的时候,规模都要有所缩小
逻辑:每两次相邻的调用,前一次要为后一次做准备
# 陷入无限循环的递归
def my_func(x):
print(x)
my_func(x + 1)
my_func(1)
'''
典例:阶乘计算
'''
def f(x):
if x == 1:
return 1
print("计算" + str(x) + "*" + str(x - 1))
return x * f(x - 1)
print(f(3)) # 打印3的阶乘
作业:递归查找
有一个不规则的list = [4,6,7,9,11,2,90,44]
定义一个函数
功能要求:
接受一个list和一个数字
返回数字在列表中排序后的位置,如果出错或者没有就返回-1
'''
思路:
1、首先按照从小到大将列表排序
2、查找list中间的数字,比我们输入的参数大还是小(用折半查找)
'''
3.特殊函数
'''
__name__
只有在本模块启动时,__name__变量等于__main__
在什么时候使用
1、可以作为这个模块的入口,在其他语言中,叫做main函数
2、也可以作为调试使用,原因是:在其他模块调用本模块时,__name__="main"
判断结果为False,所以就不会执行
'''
def my_print():
print(__name__)
if __name__=="main":
my_print() # 调用函数
print(1)
print(__name__)
4.变量的作用域
if True:
name = "小杨同学"
print(name)
'''
在python中没有块级的作用域
代码块里的变量,外部是可以调用的
'''
def func():
name = "小杨同学"
print(name) # 运行这块代码会报错,因为函数内部的变量,外部不可以调用
'''
变量的作用域链
'''
def func1():
name = "哆啦A梦"
def func2():
name = "大雄"
print(name)
func2()
print(name)
func1()
输出结果
代码说明:为什么先输出大雄呢?
首先,程序进入函数执行func2,func2里面执行print(name),打印出大雄,然后调用func2
最后打印func1中的print(name),输出哆啦A梦,调用func1
4.1作用域练习
name = "静香"
def f1():
print(name)
def f2():
name = "大雄"
f1()
f2()