函数
函数就是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
def 函数名(参数1,参数2....参数n):
函数体
return 语句
# 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
# 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数
# 函数的第一行语句可以选择性地使用文档字符串(用于存放函数说明)
# 函数内容以冒号起始,并且缩进
# return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的 return 相当于返回 None。
默认参数
(放置在形参末尾)
def user_info(name, age, profession="IT"):
print("姓名:{} --- 年龄: {} ---- 职业:{} ".format(name, age, profession))
user_info("Amy", 25)
输出
姓名:Amy --- 年龄: 25 ---- 职业:IT
关键字参数
使用参数名给函数传递参数,不关系参数列表的定义的顺序
def User_infor(name, age, profession="IT"):
print("姓名:{} ---- 年龄:{} ---- 职业 ---- {}".format(name, age, profession))
User_infor(age=25, name="Tom")
不定长参数
通过*接收参数,默认参数不可省略,返回一个元组
def User_information(name, age, profession="IT", *hobby):
print("姓名:{} ---- 年龄:{} ---- 职业 ---- {} ---- 爱好 ---- {}".format(name, age, profession, hobby))
User_information("Jerry",26, "IT", "跑步", "独处")
输出
姓名:Jerry ---- 年龄:26 ---- 职业 ---- IT ---- 爱好 ---- ('跑步', '独处')
通过** 接受位置参数,没有被定义的的关键参数放置在字典中,其中,默认参数可以省略,返回一个元组
def User_information2(name, age, profession="IT", **hobby):
print("姓名:{} ---- 年龄:{} ---- 职业 ---- {} ---- 爱好 ---- {}".format(name, age, profession, hobby))
User_information2(age=26, name="Jerry", hobby=("跑步", "独处"))
输出
姓名:Jerry ---- 年龄:26 ---- 职业 ---- IT ---- 爱好 ---- {'hobby': ('跑步', '独处')}
只接受关键字参数
参数列表中内部加入*,*后所有参数使用关键字
def User_information3(name, *, age, profession="IT", **hobby):
print("姓名:{} ---- 年龄:{} ---- 职业 ---- {} ---- 爱好 ---- {} ".format(name, age, profession, hobby))
User_information3("Jerry", age=26, profession="IT", hobby="听歌" )
输出
姓名:Jerry ---- 年龄:26 ---- 职业 ---- IT ---- 爱好 ---- {'hobby': '听歌'}
参数传值
函数参数的传递中,传递的是类型对象
在 Python 中,字符串,整形,浮点型,tuple 是不可更改的对象,而 list , dict 等是可以更改的对象
不可更改的类型:变量赋值 a = 1
,其实就是生成一个整形对象 1 ,然后变量 a 指向 1,当 a = 1000
其实就是再生成一个整形对象 1000,然后改变 a 的指向,不再指向整形对象 1 ,而是指向 1000,最后 1 会被丢弃
可更改的类型:变量赋值 a = [1,2,3,4,5,6]
,就是生成一个对象 list ,list 里面有 6 个元素,而变量 a 指向 list ,a[2] = 5
则是将 list a 的第三个元素值更改,这里跟上面是不同的,并不是将 a 重新指向,而是直接修改 list 中的元素值。
不可更改的类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是 a 的值,没有影响 a 对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可更改的类型:类似 c++ 的引用传递,如 列表,字典。如 fun(a),则是将 a 真正的传过去,修改后 fun 外部的 a 也会受影响
一句话,传递的是可改变的参数类型,参数发生改变, 否则仅仅是传递参数的值,参数不发生改变
Python样例
# 不可变
def func(b):
b = 1000
print("函数内部b:", b)
b = 1
func(b)
print(b)
输出
函数内部b: 1000
1
# 可变
def func1(b):
b.append(2)
b = [1]
func1(b)
print(b)
结果
[1, 2]
匿名函数
# lambda 只是一个表达式,函数体比 def 简单很多。
# lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
# lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
表达式:
lambda [arg1 [,arg2,.....argn]]:expression
# 两数求和
sum = lambda x, y: x + y
print(sum(1,2))
x2 = 1001
sum1 = lambda y: x2 + y
x2 = 100001
sum2 = lambda y: x2 + y
print(sum1(1)) # x2自由变量,运行时绑定
print(sum2(1))