4.函数
程序而言:函数就是对程序逻辑进行结构化或者过程化的一种编程方法。
举例:两数之间所有整数的和
def sum1(a,b):
s=0
for i in range(a,b+1):
s+=i
return s
try:
a=eval(input('第一个数:'))
b=eval(input('第二个数:'))
print('两数之间和为',sum1(a,b))
except (TypeError,NameError,SyntaxError):
print('请输入正整数')
built-in function 内置函数–>BIF
函数定义
def name_1(arg1,arg2,arg3):
#statements
return value
def sum_age(x):
'''求和'''
return x
print(sum_age.__doc__)
#求和
说明如下:
1.函数代码块以 def 关键词开头,后接函数标识符名称和小括号 ()。
2.任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
3.函数的第一行语句可以选择性地使用文档字符串----用于存放函数说明。
4.函数内容以冒号起始,并且缩进。
5.return [表达式] 结束函数,选择性的返回一个值给调用方。不带表达式的return相当于返回 None。
其中参数列表和返回值不是必须的,return后也可以不跟返回值,甚至连 return也没有。
对于return后没有返回值的和没有return语句的函数都会返回None值
有些函数可能既不需要传递参数,也没有返回值。
没有参数时,包含参数的圆括号也必须写上,圆括号后也必须有“:”。
函数调用
函数文档说明
函数参数
- 不传参函数
- 参数函数
- 顺序
函数返回值
函数参数种类
形参和实参
- 形参
- 只有在调用时才分配内存单元。调用结束后,即释放分配的内存单元,形参只在内部有效,函数调用结束返回主调函数后则不能再使用该形参变量。
- 实参
- 实参是一个确定的值,能够传递给形参。
- 作为位置参数或者关键字参数传递
- 实参是一个确定的值,能够传递给形参。
位置参数
只传递实参
关键字参数
必须位于位置参数后面
不定参数
在python中不定参数主要是指*args和 **kwargs 两个魔法变量
他们俩主要是用于函数定义,我们可以将不定数量的参数传递给一个函数
- *args用来接收任意非键值对
- **kwargs用来接收所有键值对
def uncertain_para(para,*args,**s):
print('参1:',para)
print('参2:',args)
print('参3:',s)
print(type(args))
uncertain_para([1,2,3],'a','b',name='Sheep')
'''
参1: [1, 2, 3]
参2: ('a', 'b')
参3: {'name': 'Sheep'}
<class 'tuple'>
'''
#练习 计算字符串中的数字 字母 空格 其它符号
import string
def cha(st):
a='0123456789'
b=string.ascii_letters
st=list(st)
num,s,k,other=0,0,0,0
for i in st:
if i in a:#i.isdigit()
num+=1
elif i in b:#i.isalpha()
s+=1
elif i==' ':#i.isspace()
k+=1
else:
other+=1
print('数字:',num,'字母:',s,'空格:',k,'其它:',other)
cha(input())
函数引用
函数属性
你可以获得每个 pyhon 模块,类,和函数中任意的名字空间。你可以在模块 foo 和 bar 里都有名为 x 的一个变量,,但是在将这两个模块导入你的程序后,仍然可以使用这两个变量。所以,即使在两个模块中使用了相同的变量名字,这也是安全的,因为句点属性标识对于两个模块意味了不同的命名空间。
内嵌函数
作用域
bar()整个函数处于外部fool()函数域里。只能在fool内部调用
变量作用域
作用域的产生
python中只有当变量在module Class 函数 中定义的时候,才会有作用域的含义
def foo():
a='foo'
print(a)
foo()
print(a)
在作用域中定义的变量,一般只在作用域内有效
流程语句和错误异常语句中,不会产生作用域
作用域的类型
python中,使用一个变量时不需要提前声明。但在真正使用时,他必须绑定到某个内存对象(被定义,赋值)。这种变量名的绑定在当前作用域引入新的变量,同时,屏蔽外层作用域中的同名变量。
-
局部作用域(locale–L)
局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。 -
嵌套作用域(enclosing–E)
- E也包含在def关键字中,E和L是相对的,E相对于跟上层的函数而言也是L,与L的区别在于,对于一个函数而言,L定义在定义此函数内部的局部作用域。
- 主要为了实现python的闭包,而增加的现实。
-
全局作用域(Global-G)
即在模块层次中定义的变量。模块顶层申明的变量具有全局作用域。从外部来看,模块的全局变量就是一个模块对象的属性。
-
内置作用域(built-in–B)
- 系统固定模块中定义的变量