函数
引子
求1 - 15的和:
求23-36的和;
求55-68的和:
程序而言:函数就是对程序逻辑进行结构化或者过程化的一种编程方法
built-in function 内置函数—>BIF
函数的定义
说明如下:
1.函数代码块以 def 关键词开头,后接函数标识符名称和小括号 ()。
2.任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
3.函数的第一行语句可以选择性地使用文档字符串----用于存放函数说明。
4.函数内容以冒号起始,并且缩进。
5.return [表达式] 结束函数,选择性的返回一个值给调用方。不带表达式的return相当于返回 None。
其中参数列表和返回值不是必须的,return后也可以不跟返回值,甚至连 return也没有。
对于return后没有返回值的和没有return语句的函数都会返回None值
有些函数可能既不需要传递参数,也没有返回值。
没有参数时,包含参数的圆括号也必须写上,圆括号后也必须有“:”。
def sum_of_num(i1,i2):
result = 0
for i in range(i1,i2+1):
result += i
return result
print(sum_of_num(1,15))
def test(x,y):
print(x)
print(y)
print('1'.center(10,'*'))
test(1,2)
print('2'.center(10,'*'))
test(x=1,y=2)
print('3'.center(10,'*'))
test(y=2,x=1)
print('4'.center(10,'*'))
test(1,y=2)
结果
****1*****
1
2
****2*****
1
2
****3*****
1
2
****4*****
1
2
函数调用
函数文档说明
函数参数
- 不传参函数
- 传参函数
- 顺序
函数返回值
函数参数种类
形参和实参
-
形参
-
-
只有在调用时才分配内存单元.调用结束后,即释放所分配的内存单元.因此,形参只在内部有效,函数调用结束返回主调用函数后则不能再使用该形参变量
.
-
-
实参
-
-
实参是一个确定的值,能够传递给形参.
-
- 作为位置参数或者关键字参数传递
-
位置参数
def usr_manage(name,age,job,hobby):
print("用户管理系统".center(16,'-'))
print("\tName:\t",name)
print("\tAge:\t", age)
print("\tJob:\t", job)
print("\tHobby:\t", hobby)
print("用户管理系统".center(16,'_'))
usr_manage("Jack",21,"IT")
usr_manage("Tom",20,"IT","Coding")
usr_manage("Jim",21,"Student","Reading")
只传递实参,位置--------对应
关键字参数
def usr_manage(name,age,job,hobby):
print("用户管理系统".center(16,'-'))
print("\tName:\t",name)
print("\tAge:\t", age)
print("\tJob:\t", job)
print("\tHobby:\t", hobby)
print("用户管理系统".center(16,'_'))
usr_manage("Jack",hobby="coding",job="student")
usr_manage("Tom",20,"IT","Coding")
usr_manage("Jim",21,"Student","Reading")
默认值参数,关键字参数,必须放置于位置参数之后
不定参数
在python中不定参数主要是指 *arg’和**kwargs两个魔法变量
他们俩主要是用于函数定义,我们可以将不定数量的参数传递给一个函数.
-
*args 用来接收任意非键值对的任意数量的参数列表给函数
```
def uncertain_para(para,para2,*args):
print("普通位置参数:",para,para2)
print("不定参数:",args)
print(type(args))
uncertain_para(1,2,3,4,‘a’,‘b’)
uncertain_para([1,2,3],“ab”,“cd”,“ef”)
#普通位置参数: 1 2
#不定参数: (3, 4, ‘a’, ‘b’)
#<class ‘tuple’>
#普通位置参数: [1, 2, 3] ab
#不定参数: (‘cd’, ‘ef’)
#<class ‘tuple’>
Process finished with exit code 0
```
- **kwargs 用来接收任意不定长度的键值对
def un_para_key(x,y,*z,**kwargs):
print(x,y,z)
print(kwargs)
print(type(kwargs))
un_para_key(1,2,3,4,5,'a','b',a=1,b=2)
##1 2 (3, 4, 5, 'a', 'b')
##{'a': 1, 'b': 2}
##<class 'dict'>
# 统计字母,数字,空格其他字符个数
def count(s):
digit_num=0
zi_num=0
spance_num=0
other_num=0
for i in s:
if i.isdigit():
digit_num += 1
elif i.isalpha():
zi_num += 1
elif i==' ':
spance_num +=1
else:
other_num +=1
return(digit_num,zi_num,spance_num,other_num)
print(count('aSas12312 DSAD2%'))
函数的引用
函数属性
函数属性是python中另一个使用了句点属性标识并拥有名字空间的领域.
def foo():
'foo()---properly created doc string.'
def bar():
pass
bar.__doc__="0ops,forget the doc str above"
bar.version = 0.1
可以获得每个 pyhon 模块,类,和函数中任意的名字空间。你可以在模块 foo 和 bar 里都有名为 x 的一个变量,,但是在将这两个模块导入你的程序后,仍然可以使用这两个变量。所以,即使在两个模块中使用了相同的变量名字,这也是安全的,因为句点属性标识对于两个模块意味了不同的命名空间,比如说,在这段代码中没有名字冲突:
内嵌函数
作用域
bar()整个函数都处于外部foo()函数的作用域里(foo()是我们可以从外部访问的一个对象区域). 除了在foo()内部,其他地方无法对bar()进行调用
def foo():
def bar():
print("bar() called.")
print("foo()called.")
bar()
foo()
bar()
bar() called.
File “F:/wrok/作业/7.23/函数.py”, line 125, in
bar()
NameError: name ‘bar’ is not defined
变量作用域
作用域的产生
就作用域而言,python和c有很大差别,只有当变量在module,Class,函数中定义的时候,才会有作用域的概念.
def foo():
a = "foo"
print(a)
foo()
print(a)
在作用域中定义的变量,一般只在作用域内有效.需要注意的是,在if-elif-else,for-else,while-else,try-except(else-finally)等关键字语句中不会产生作用域.
if True:
a = 100
print(a)
print('-'*5)
print(a)
#100
#-----
#100
作用域的类行
在python中,使用一个变量时并不需要预先声明它.单在真正的使用时候,它必须绑定到某个内存对象(被定义,赋值).这种变量名的绑定将在当前作用域引入新的变量,同时,屏蔽外层作用域中的同名变量.
-
局部作用域(locale—L)
局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。 -
嵌套作用域(enclosing—E)
- E也包含在def关键字中,E和L是想对的,E相对于跟上层函数而言也是L.与L的区别在于,对于一个函数而言,L是定义在定义在此函数内部的局部作用域.
- 主要为了实现python的闭包,而增加的实现.
-
全局作用域( Global — G)
即在模块层次中定义的变量
- 内置作用域( built-in— B)
- 系统固定模块中定义的变量
搜索变量名的优先级: 局部作用域>嵌套作用域>全局作用域>内置作用域.
全部变量和局部变量
gbl_str = "foo"
def foo():
loc_str = "bar"
return gbl_str + loc_str
print(foo())
print(gbl_str)
print(loc_str)
NameError: name ‘loc_str’ is not defined