定义一个函数def
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号 : 起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None
def 函数名(参数列表):
函数体
练习1:打印喜欢的食物【注意缩进】
def first():
print('亚伦喜欢米饭')#缩进
first()
无参数传递,无论调用多少次,只能打印’亚伦喜欢米饭‘
打印其他人时,增加传递参数,达到多次调用
def first(people):
print(people,'喜欢米饭')#缩进
p1='萨沙'
p2='亚伦'
first(p1)
first(p2)
加上了名字,但是人的喜好各不相同,那就在增加一个传递参数
def first(people,food):
print(people,'喜欢'+food)#,有间隙,+没有间隙
p1='萨沙'
p2='亚伦'
f1='米饭'
f2='面条'
first(p1,f1)
first(p2,f2)
含参数传递,调用两次first函数,根据传递的不同参数打印不同内容
练习2:利用def进行加法运算
def sec(a,b):
print(a+b)
sec(2,3)
无返回函数,虽然函数进行了a+b的运算,但是这个运算结果只能在def函数中进行使用,在def外不能进行使用
在a+b结束后在def函数外*2,就需要加上关键字return
def sec(a,b):
return a+b
print(sec(2,3)*2)#直接打印返回值
num=sec(3,4)#将返回值赋给变量num
print(num*2)
当有return时def函数会返回a+b的结果,打印sec(2,3)就不会是None,而是a+b ,同样有了返回值,就可以进行赋值操作
练习三:计算BMI
def BMI(h,w):
h=h/100
bmi=w/(h*h)
return bmi
BMI(h=165,w=55)
BMI(w=55,h=165)
关键字参数,忘记先输那个值时,关键字参数就能起到对应参数对应计算【前面都是必要参数顺序不能更改】
增加一个控制国内国际的区分参数,默认是国内计算方法
def BMI(h,w,s='国内'):
h=h/100
bmi=w/(h*h)
B=''
if s == '国内':
if bmi < 18.5:
B= "体重过轻"
elif bmi < 24.0:
B= "正常范围"
elif bmi < 28.0:
B= "超重"
else:
B= "肥胖"
else:
if bmi < 18.5:
B= "体重过轻"
elif bmi < 24.9:
B= "正常范围"
elif bmi < 29.9:
B= "超重"
else:
B= "肥胖"
return s+B
print(BMI(h=165,w=55))
print(BMI(w=55,h=165,s='国外'))
默认参数,不输时,默认为此值
练习四:统计信息
统计某人的基本信息和爱好,基本信息一一对应,爱好是各有不同,这里就用到了不定长函数
def 函数名(必须参数,默认参数,*keys,**kwargs):
函数体
【必需参数必须放在前面,关键字参数不允许出现】
【*keys表示接受任意数量的必需参数,*kwargs表示接受任意数量的关键字参数】
【keys,kwargs是自定义命名】
def info(name,*keys,**kwargs):
print(name)
print(keys)
print(kwargs)
info('亚伦','游戏','睡觉',age=13,sex='男',phone='18767452369')
可以看到keys是元组,kwargs是字典
*keys会将传入的位置参数打包为一个元组,并在函数体内部使用。这意味着函数可以接受任意数量的位置参数,并且可以通过索引访问它们
**args会将传入的关键字参数打包为一个字典,并在函数体内部使用。这意味着函数可以接受任意数量的关键字参数,并且可以通过键来访问它们
def info(name,*keys,**kwargs):
print(name)
print('个人信息:')
for k, v in kwargs.items():
print('\t'+k, '--->', v)
print('爱好是:')
for i in keys:
print(i, end=',')
info('亚伦','游戏','睡觉',age=13,sex='男',phone='18767452369')
练习五:匿名函数lambda
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
- 虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,内联函数的目的是调用小函数时不占用栈内存从而减少函数调用的开销,提高代码的执行速度。
格式
lambda arguments: expression
lambda关键字表示创建一个匿名函数。
arguments是匿名函数的参数,可以为空或包含一个或多个参数。
expression是一个表达式,它定义了匿名函数的返回结果
lambda
函数通常用于需要一个简单函数的地方,尤其是在函数的参数中或在函数内部的简单逻辑中。它提供了一种简洁的方式来定义和使用函数,避免了显式地定义一个带有函数名的函数。
x = lambda a : a + 10
print(x(5))#必需参数
y = lambda p,q:p+q
print(y(p=4,q=5))#关键字参数
z = lambda p,q,s=3:p+q+3
print(z(p=4,q=5))#默认参数
匿名函数lambda同函数def一样,只不过lambda用于简单
全局变量与局部变量
一般有三种命名空间:
- 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
- 全局变量(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
- 局部变量(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
查找优先级:局部的命名空间 -> 全局命名空间 -> 内置命名空间
若找不到则会报 NameError 没有定义
def sum(arg1, arg2):
total = arg1 + arg2 # total在这里是局部变量.
print(id(total))
print("函数内是局部变量 : ", total)
return total
total = 0 # 这是一个全局变量
print(id(total))
sum(10, 20)
print(id(total))
print("函数外是全局变量 : ", total)
'''
2790929989840
2790929990800
函数内是局部变量 : 30
2790929989840
函数外是全局变量 : 0
进程已结束,退出代码0
'''
第7行定义total,顶格所以是全局变量
第9行进入sum函数
第2行定义了total,在函数内所以是局部变量【局部变量的优先级高】
第五行return 结束函数sum,局部变量total被销毁,释放空间
第11行,全局变量【局部变量已经被销毁】