定义
毕竟,我是从前端过来的,我们都在知道,函数是非常重要的,可以进行代码复用,省掉很多重复代码
Python中是如何定义函数的呢
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名 () :
函数内容
函数名() # 函数调用
传参数
这个我刚刚看了一下,和JavaScript中有点像,也有传值传递,引用传递
这个函数,内容有待多,那就分开两次来
我知道这个传递参数还是很重要的,
按照值传递的有,字符串,数字,和元组,其他都是引用传递
参数
Python中调用的时候,参数都分了好多种
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必须参数
必需参数须以正确的顺序
传入函数。调用时的数量
必须和声明时的一样
。
调用printme()函数,你必须传入一个参数,不然会出现语法错误:
#!/usr/bin/python3
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print (str)
return
#调用printme函数
printme()
关键字参数
关键字参数和函数调用关系紧密
,函数调用使用关键字参数来确定传入的参数值
。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
以下实例在函数 printme() 调用时使用参数名:
#!/usr/bin/python3
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print (str)
return
#调用printme函数
printme( str = "菜鸟教程")
默认参数
调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
#!/usr/bin/python3
#可写函数说明
def printinfo( name, age = 35 ):
"打印任何传入的字符串"
print ("名字: ", name)
print ("年龄: ", age)
return
#调用printinfo函数
printinfo( age=50, name="runoob" )
print ("------------------------")
printinfo( name="runoob" )
不定长参数
你可能需要一个函数能处理比当初声明时更多的参数
。
这些参数叫做不定长参数
,和上述 2 种参数不同,声明时不会命名。基本语法如下:
#!/usr/bin/python3
# 可写函数说明
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
for var in vartuple:
print (var)
return
# 调用printinfo 函数
printinfo( 10 )
printinfo( 70, 60, 50 )
好今天就到这里,发现函数这么多类型,在JavaScript中最新版本中都有哎
匿名函数
Python中也是有匿名函数的,利用lambda表达式创建的
python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
- lambda 只是一个
表达式
,函数体比 def 简单很多
。 - lambda的主体是一个
表达式
,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。 - lambda 函数
拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
。 - 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
语法
lambda [arg1 [,arg2,.....argn]]:expression
#!/usr/bin/python3
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))
作用域
Python中作用域分的还是很清楚的,但是JavaScript中就不是很清楚了,哎,我们都知道JavaScript就三种作用域,全局作用域,块级作用域,局部作用域
而Python有这些
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
以L –> E –> G –>B 的规则
查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找
。
x = int(2.9) # 内建作用域
g_count = 0 # 全局作用域
def outer():
o_count = 1 # 闭包函数外的函数中
def inner():
i_count = 2 # 局部作用域
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域
,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问
,而全局变量可以在整个程序范围内访问
。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
网友评论