上一篇我们初步介绍python中函数的定义与调用
Python进阶(2):函数-CSDN博客
这里继续:
关键字参数:
形参1=实参1,形参2=实参2,......
关键字参数是指使用形式参数的名字来确定输入的参数值。通过该方式指定实际参数时,不再需要与形式参数的位置完全一致。只要将参数名写正确即可。这样可以避免用户需要牢记参数位置的麻烦,使得函数的调用和参数传递更加灵活方便。
关键字参数使用键值对的标识,键名一定与形参完全一致,传入的参数可以是无序的
参数默认值
def functionName(...,param1=defaultValue1,param2=defaultValue2)
在Python中,函数(方法)不允许重载,因python中没有指定数据类型,而且函数的参数个数也是可变的.参数可以使用默认值,关键字参数,可变参数等来伪装重载
调用函数时,如果没有指定某个参数将抛出异常,为了解决这个问题,我们可以为参数设置默认值,即在定义函数时,直接指定形式参数的默认值。这样,当没有传入参数时,则直接使用定义函数时设置的默认值。
形式参数的默认值必须在所有参数的最后,否则将产生语法错误.
可变参数或者引用参数的默认值最好设置为None
两个下划线开始,两个下划线结束的属性代表特殊指定属性
函数名.__name__ 打印函数名
函数名.__defaults__ 打印默认值元组
可变参数(不定长参数)
在 Python 中,还可以定义可变参数。可变参数也称不定长参数,即传入函数中的实际参数可以是零个、一个、两个到任意个。类似于C#的params关键字.
定义可变参数时,主要有两种形式,一种是*parameter,另一种是**parameter。
*parameter
这种形式表示接收任意多个实际参数并将其放到一个元组中.如果想要使用一个已经存在的列表作为函数的可变参数,可以在列表的名称前加“*”.
这种写法类似于C++的指针,int* 与 int[] 大多数情况下是一致的,代表连续元素的集合或数组
**parameter
这种形式表示接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中,如果想要使用一个已经存在的字典作为函数的可变参数,可以在字典的名称前加“**”
函数的返回值
return obj
返回的obj可以是任意类型,比如数字,字符串,元组,列表,字典等.
当函数中没有 retun 语句时,或者省略了retum 语句的参数时,将返回 None,即返回空值.
在python中,可以打印没有return返回值的函数,如print(XX())将打印None,而在C#等其他编程语言中,打印返回值为空(void)的将抛出异常,如 print(XX())将会抛出异常
变量的作用域
变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。在程序中,一般会根据变量的“有效范围”将变量分为“局部变量”和“全局变量”。
局部变量
局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。即函数内部的名字只在函数运行时才会创建,在函数运行之前或者运行完毕之后,所有的名字就都不存在了。所以,如果在函数外部使用函数内部定义的变量,就会出现抛出 NameError 异常。
全局变量
与局部变量对应,全局变量为能够作用于函数内外的变量。如果把代码块看作一个树Tree,那么全局变量和函数定义处于相同的节点等级TreeNodeLevel.
全局全局变量主要有以下两种情况。
(1)如果一个变量在函数外定义,那么不仅可以在函数外可以访问到,在函数内也可以访问到。在函数体外定义的变量是全局变量。
(2)在函数体内定义,并且使用 global 关键字修饰后,该变量也就变为全局变量。在函数体外也可以访问到该变量,并且在函数体内还可以对其进行修改。
匿名函数lambda
result=lambda (arg1,arg2,...,argn):expression
匿名函数(lambda)是指没有名字的函数,应用在需要一个函数但是又不想费神去命名这个函数的场合。通常情况下,这样的函数只使用一次。兰姆达lambda表达式与C#的兰姆达lambda表达式基本上一致,只是在语法上有所变化(C#使用"=>",python使用lambda关键字)
使用 lammbda 表达式时,参数可以有多个,用逗号分隔,但是表达式只能有一个,即只能返回一个值,而且也不能出现其他非表达式语句(如for或while)
lambda表达式 的主要用途是指定短小的回调函数
测试程序
def Hello(strName):'''打招呼:param strName: 姓名:return: 无返回值'''print("Hello:",strName)
def phrase():'''成语:return:'''import datetimephraseList=["鼠目寸光","牛鬼蛇神","虎啸龙吟","兔起鹘落","龙飞凤舞","蛇食鲸吞","马革裹尸","羊质虎皮","猴年马月","鸡犬不宁","狗急跳墙","猪狗不如"]month=datetime.date.today().monthprint("当前月份:",month,",对应成语:",phraseList[month-1])
Hello(("Snake"))
phrase()
print("---------------值传递---------------")
def passByValue(num):'''值传递:打印当前数以及平方数:param num: 一个数字:return:'''import mathprint("当前数为:",num)num=math.pow(num,2)print("平方数为:", num)
number=2.5
passByValue(number)
print("重新读取值传递的数据:",number)
print("---------------引用传递---------------")
def passByReference(lst):'''引用传递:列表的末尾增加一个元素:param lst: 一个列表:return:'''lst.append("方兰生")print("当前列表为:", lst)
listRole=["百里屠苏","风晴雪","红玉"]
print("原列表为:",listRole)
passByReference(listRole)
print("刷新引用传递列表为:",listRole)
def getBMI(person,height,weight):'''获取身高体重比值BMI=体重/身高的平方:param person: 人员姓名:param height: 身高,单位 米:param weight: 体重,单位 千克'''print("姓名:{:s},身高:{:.4f}体重:{:.4f}".format(person,height,weight))BMI=weight/(height*height)if BMI < 18.5:print("{:s}过瘦,BMI为{:.4f}".format(person,BMI))elif BMI >= 18.5 and BMI <= 25:print("{:s}正常,BMI为{:.4f}".format(person, BMI))else:print("{:s}过胖,BMI为{:.4f}".format(person, BMI))
def getBMIUseDefValue(height,weight,person="snake"):'''获取身高体重比值BMI=体重/身高的平方,参数使用默认值:param person: 人员姓名:param height: 身高,单位 米:param weight: 体重,单位 千克'''print("姓名:{:s},身高:{:.4f}体重:{:.4f}".format(person,height,weight))BMI=weight/(height*height)if BMI < 18.5:print("{:s}过瘦,BMI为{:.4f}".format(person,BMI))elif BMI >= 18.5 and BMI <= 25:print("{:s}正常,BMI为{:.4f}".format(person, BMI))else:print("{:s}过胖,BMI为{:.4f}".format(person, BMI))
print("---------------测试调用多参数函数---------------")
getBMI("张三",1.70,70)
getBMI("李四",1.80,57)
getBMI("王五",1.76,80.3)
print("---------------测试函数[关键字参数]---------------")
getBMI(height=1.83,weight=71.2,person="云天河")
print("---------------测试函数[参数默认值]---------------")
getBMIUseDefValue(1.78,83.5)
print("函数名称",getBMIUseDefValue.__name__,"函数的默认值:",getBMIUseDefValue.__defaults__)
print("---------------测试函数[可变参数*parameter]---------------")
def printMusic(*lst):'''打印五音:param lst:'''print("中国古代的五音为:")for item in lst:print(item,end="\x20")print()
printMusic("宫","商","徵")
printMusic("角","羽")
lstMusic=["宫","商","角","徵","羽"]
printMusic(*lstMusic)
print("---------------测试函数[可变参数**parameter]---------------")
def printRole(**dict):'''打印角色,键值对:param dict: 字典'''for key, value in dict.items():print("角色ID:",key,",名字:",value)print()
printRole(Role1="百里屠苏",Role2="欧阳少恭")
dict={"Role1":"风晴雪","Role2":"红玉","Role3":"欧阳少恭"}
printRole(**dict)
print("---------------测试函数[返回值return]---------------")
def promotion(totalMoney):'''计算总金额已经折扣后金额:param totalMoney:总金额:return:总金额,折扣后金额'''salesMoney=totalMoneyif totalMoney>=3000:salesMoney = totalMoney * 0.7elif totalMoney>=1000:salesMoney = totalMoney * 0.8elif totalMoney >= 500:salesMoney = totalMoney * 0.9return (totalMoney,salesMoney)
moneyList=[250,675,1600,3200]
for money in moneyList:print(promotion(money))
print("---------------测试函数[全局变量,以及global关键字标记为全局变量]---------------")
variMessage="我是全局变量,可以在函数体内使用"
def useVariable():print("打印函数体:",variMessage)
useVariable()
print(variMessage)
message="函数体外的变量"
def testGlobalVariable():global messagemessage = "函数体内的变量"print(message)
print(message)
testGlobalVariable()
print(message)
print("---------------测试匿名函数[lambda表达式]---------------")
import math
perimeter=lambda x:2*math.pi*x
print("半径为3的圆的周长为:",perimeter(3))