函数"/>
Python(三):函数
文章目录
- 3 函数
- 3.1 函数声明与调用
- 3.2 函数参数
- 收集参数 (int argc, char \*argv[])
- 3.3 函数的返回值
- 3.4 变量的作用域
- 3.5 内嵌函数和闭包(Closure)
- 3.6 lambda表达式
- 3.7 递归
3 函数
函数是最重要的语句封装形式之一。
3.1 函数声明与调用
Python中使用def
关键字来声明函数,并且由于Python对泛型(多态)的支持,函数没有类型声明。
在同文件内,直接键入函数名即可调用(同样必须先定义)。
# 一个简单的例子
def printHello():print("hello!")printHello()
hello!
3.2 函数参数
函数的参数通过括号内传递,支持带默认值的参数(可选参数),以及关键字参数。
# 普通参数
def printHello(name) :print("hello, ", name)printHello("wuyao")
hello, wuyao
# 带默认值的参数
def printHello(name="zhaizhanhu") :print("hello, ", name)printHello()
hello, zhaizhanhu
# 支持关键字,防止参数交叉产生错误
def printHello(serveName, clientName) :print("hello, ", clientName)print("my name is ", serveName)printHello(clientName = "zhaizhanhu", serveName = "wuyao")
hello, zhaizhanhu
my name is wuyao
收集参数 (int argc, char *argv[])
C/C++中我们可以通过(int argc, char *argv[])
来获取参数列表,Python中也可以提供*
来实现,其默认将所有参数打包为一个元组。
def paraget(*para) :print("paraNumbers : ", len(para))for each in para :print(each, end=" ")paraget(1,2,"wuyao")
paraNumbers : 3
1 2 wuyao
# 对于使用了`*`来搜集参数的函数,可以使用关键字的方法支持其他参数
def paraget(*para, name) :print("paraNumbers : ", len(para))for each in para :print(each, end=" ")paraget(1,2,name="wuyao")
paraNumbers : 2
1 2
3.3 函数的返回值
使用return语句实现。
def add(num1,num2) :return num1 + num2add(51,5.1)
56.1
返回多个值可以采用列表等形式。
def info(name):if name == "wuyao":return ["wuyao","19B","male","188..."] elif name == "zhaizhanhu" :return ["zhaizhanhu","19S","male","250..."]else :return "error name!"info("zhaizhanhu")
['zhaizhanhu', '19S', 'male', '250...']
info("wanchunlei") # 不存在这个名字
'error name!'
3.4 变量的作用域
变量的作用域与C/C++类似,函数内部定义的变量仅在函数内部可见。全局变量是在文件中直接声明的,局部变量是在子函数中声明的;全局变量在整个文件内都可见,子函数中若存在和全局变量重名的变量,会在子函数区间覆盖全局变量,除非使用global
关键字。
3.5 内嵌函数和闭包(Closure)
A函数内部可以嵌套函数B,并且被嵌套的函数B仅对于函数A可见。
闭包指的是内嵌的函数B对A函数中变量的引用。
# 直接给函数和函数的嵌套函数传参的方法
def printHello(greeting) :def printName(name) :print(greeting,", ",name)return printNameprintHello("hi")("wuyao")
hi , wuyao
3.6 lambda表达式
lambda表达式可以定义轻量级的运算函数,来简化代码。基本格式是表达式名 = lambda para0, para,....paran : 函数体
。
sqrt = lambda a,b,c : (-b+(b**2 - 4*a*c)**0.5)/(2*a) # 一元二次方程求根公式
sqrt(1,-2,1)
1.0
3.7 递归
递归需要反复调用函数,压栈弹栈,并且递归是非常占用资源的,其他语言支持尾递归优化来改善这个问题,python目前不支持,尽管这是一个经典方法,但没事不要用。
用法上与C/C++大同小异,都是利用return
语句再次调用自身实现的
更多推荐
Python(三):函数
发布评论