python——函数

python——函数


目录

一、函数是什么

函数调用
函数返回

二、函数的参数传递

1.位置传参
2.关键字传参
3.*序列传参
4.**字典关键字传参
5.综合传参

三、函数的缺省参数

四、函数的不定长参数

1.星号元组传参
2.双星号字典传参

五、函数作用域

1.全局变量和局部变量
2.作用域分类
变量名查找规则
3.global语句
4.函数嵌套
5.nonlocal语句(非本地,非局部

一、函数是什么?

  1. 函数是一段可执行的代码块
  2. 作用
    ①.划分功能模块,更好管理软件工程
    ②.复用代码,减少开发工作量
    ③.提高代码阅读性,降低维护成本
  3. 定义:
def function([参数列表(parameter list)]):
	[注释]
	语句块
	return[value]

说明:

函数本身也是一个变量(可调用类型,只读)
函数有自己的命名空间
参数列表可以有,可以没有
内容以冒号开始且缩进
语句块部分不能为省略,若为空语句,需填充pass
return[]结束语句。选择性地返回一个值给调用方,若无则返回None

demo1:

#无参数时
def hello():
	print("hello!")
	return[0]

#有参数时
def hello(n):
	if n==1:
		print("hello",n)
	return 

函数调用

函数调用:函数名([参数列表])
1.函数调用是一个表达式
2.若无return语句,函数执行完毕返回None值对象
3.若需返回其他的值对象需用return语句
4.函数使用是必须先定义后调用

def hello(n):
	if n==1:
		print("hello",n)
	return 
hello(1)

函数返回

return[表达式]
作用:结束当前函数的执行,返回到调用函数的地方,同时返回一个值对象的引用关系
①.return可以省略 ==> return None
②.可以返回一个值或一组值(逗号隔开)

二、函数的参数传递

  1. 位置传参
  2. 关键字传参
  3. *序列传参
  4. **字典关键字传参
  5. 综合传参

1.位置传参

位置传参:实际参数的对应关系与形式参数的对应关系是以位置来传递的。

def sum(a,b,c):
	print('a=',a)
	print('b=',b,'c=',c)
sum(1,2,3)
>>>a=1
>>>b=2,c=3

说明
实参和形参通过位置进行对应和传递
实参和形参的个数必须完全相同

2.关键字传参

关键字传参:指传递参数时按照形参的名称给关键字赋值
实参和形参按名称进行匹配(可无序

def sum(a,b,c):
	pass
sum(b=2,a=1,c=3)

3.*序列传参

序列类型(list,tuple,str)作为参数列表传递
要求:序列的元素个数必须与参数个数相同

def different(a,b,c):
	pass
s1=[11,22,33]    #列表
different(*s1)
//
s2=(11,22,33)  #元组
different (*s2)
//
s3="11,22,33"  #str
different(*s3)

4.**字典关键字传参

实参和形参通过字典进行传递和匹配,字典的传递给键对应的形参

demo2

def different(a,b,c):
	pass
d1={"c":33,"a":11,"b":22}
different(**d1)

TIPS:

字典传参的键名和形参名必须一致
键名必须为字符串
键名要在形参中存在

5.综合传参

以上几种的混合使用

三、函数的缺省参数

若形参被赋予默认参数值,那么该函数在调用时,若无实参传递则使用默认值计算

语法:

def 函数名(形参1=默认1,形参2=默认2,……):
#例如
def info(name,age=1,addr='不详'):
	print ('姓名':name,"年龄":age,"住址":addr)

说明:

  1. 必须自右至左以此存在。若从某个地方开始有,则它右边的部分也必须有缺省参数。
  2. 调用时可更改默认参数

四、函数的不定长参数

不定长参数
{

  1. 星号元组形参
  2. 双星号元组形参

}

1.星号元组形参

语法:

def 函数名(*元组形参名):
	代码块
	return
#demo
def myfun(*args):
	print ("实参个数是",len(args))
	print(args)
	i=1
	for x in args:
		print("第",i,"个参数是:",x)
		i+=1
myfun()

命名关键字形参:如果要限制关键字参数的名字,可用命名关键字参数
*之后的参数被视为命名关键字参数

语法:

def 函数名(*元组形参名,命名关键字形参名):
	代码块
	returndef 函数名 (*,命名关键字形参名)
	代码块
	return
#demo
def myfun(a,b,*arge,c,d):
	print(a,b,c,d,args)
myfun (11,b=2,c=33,d=44)

>>>11,22,33,44,()
>>>
>>>
#demo
'''
编写一个函数,该函数有两个参数,
调用函数时第一个为可变参数,
第二个参数为关键字参数
当关键字参数key=1时,讲前边传入的可变参数的数值通过冒泡排序方法进行升序排序
当关键字参数key=2时,讲前边传入的可变参数的数值通过冒泡排序方法进行降序排序
'''
def sort_num(*num,key):
    lst=list(num)
    if key==1:
        for i in range(len(lst)-1):
            for j in range(len(lst)-1-i):
                if lst[j]>lst[j+1]:
                    lst[j],lst[j+1]=lst[j+1],lst[j]
    elif key==2:
        for i in range(len(lst)-1):
            for j in range(len(lst)-1-i):
                if lst[j]<lst[j+1]:
                    lst[j],lst[j+1]=lst[j+1],lst[j]
    return lst

list1=[4,3,53,2,1,5,6,7,8,9,10]
print(sort_num(*list1,key=2))


>>>[53, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>>
>>>

2.双星号字典形参

语法:

def 函数名(**dict字典形参名):
	代码块
	return
#demo
def myfun(**kwargs):
	print("参数个数:",len(kwargs.items()))
	for k,v in kwargs.items():
		print(k,"->>",v)
myfun(name="lilei",age=18)

参数的参数列表顺序:
以上传参方式均可混合搭配使用
顺序为:
位置形参,星号元组形参,命名元组形参,双星号字典形参,默认

有其他不懂的地方

>>>help"def"

可变 / 不可变类型的实参的参数传递的区别
可变类型:
列表list,集合set,字典dict
可以改动其里面的内容,本身位置不变
不可变类型:
固定集合 frozenset,元组tuple,字符串 str,数字numbers

五、函数作用域

  作用域是python程序的一块文本区域,是变量或函数访问时查找名称
的范围空间

1.全局变量和局部变量

①.全局变量:定义在函数外部,当前文件内部的变量
②.局部变量:定义在函数内部的变量(包含函数参数)

#demo
v=100			//全局变量
def fn():
	v=200		//局部变量
	print(v)
fu() //200
print(v) //100

2.作用域4分类:

2.作用域4分类:
①.局部作用域(函数内) 		Local 							L
②.外部嵌套函数作用域 			Enclosing function locals		E
③.函数定义所在文件的作用域		Global(moudle)					G
④.python内置模块作用域 		Built-in(python)				B
#demo
'''
__doc__显示的是该部分内容

'''
v=100   		#全局作用域G
def fun1():
	v=200		#外部嵌套作用域E
	print("fun1.v=",v)
	def fun2():
		v=300	#局部作用域L
		print("fun2.v=",v)
	fun2()
fun1()
print("v=",v)
print(__doc__)	#__doc__是内建作用域变量
变量名查找规则:

在访问变量时,先查找本地变量,然后是包裹此函数的外部函数的函数内部变量,之后是全局变量,最后是内置变量
L—>E—>G—>B


3.global语句

global 语句:全局声明
作用:将函数内的变量声明为全局变量
语法:global 变量名1,变量名2,……
tip:若形参与全局变量冲突时global失效

#demo1
v = 100
def fn():
    global v  			# 声明全局变量v
    v = 200  			# 修改全局的v变量
    print(v)
    
fn()
print(v)

#demo2
v = 100
def fn(v):
    global v  			# error,v出现了参数列表里面		
    print(v)
    
fn(200)

global说明:
1.全局变量如果要在函数内部被赋值,则必须经过全局声明,否则被认为是局部变量
2.全局变量在函数内部不经过声明可以直接读取访问(前提是变量已经存在)
3.不能先声明局部变量,,再用global声明为全局变量,此做法不符合语法规则
4.global变量列表里的变量名不能出现在此作用的参数列表里,for循环控制目标,类定义,函数定义以及import导入名字中

4.函数嵌套

  函数嵌套是指一个函数里用def语句来创建其它函数的情况
#嵌套示例
def fn_outher():
	print("外部函数被调用")
	def fn_inner():
		print("fn_inner被调用")
	fn_inner()
	print("外部函数调用结束")
fn_outher()

5.nonlocal 语句 (非本地,非局部)

作用:

  告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量。而是外部嵌套函数内的变量

语法: nonlocal 变量名1,变量名2,……
# nonlocol语句
var = 100


def outter():
    var = 200

    def inner():
        nonlocal var  # 指定var为外层嵌套函数作用域
        # global var
        var += 1  # 如果不声明此行会因为变量名重复而出错
        print("innner.var=", var)
    inner()
    print("outter.var=", var)


outter()

#一般命名的时候就会把作用域定义好,基本不会用这种方法

说明:

  1. nonlocal语句只能在被嵌套函数的内部进行使用
  2. 访问nonlocal变量将对外部嵌套函数的作用域内的变量进行操作
  3. 当有两层或两层以上函数嵌套层时,访问nonlocal变量只对最近一层的变量进行操作
  4. nonlocal语句的变量列表里的变量名,不能出现在此作用域的参数列表中

两个函数:
globals() 返回当前全局作用域内变量的字典
locals() 返回当前局部作用域内变量的字典

人生苦短,我用python

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值