函数的参数
形式参数和实际参数
1、 在定义函数时,函数名后面括号中的变量名称叫做“形式参数”,或者称为“形参”
2、 在调用函数时,函数名后面括号中的变量名称叫做“实际参数”,或者称为“实参”
参数分类
(以下四点归纳引用自老师的笔记https://mp.youkuaiyun.com/mdeditor#)
1:位置参数
def foo(x,y,z):
print (x,y,z)
foo(1,2,3)
2:关键字参数
def foo(x,y,z):
print (x,y,z)
foo(y=2,x=1,z=3) -->在调用时体现
**1:关键字实参必须在位置实参后面**
# 2: 不能重复对一个形参数传值
# foo(1,z=3,y=2) #正确
# foo(x=1,2,z=3) #错误**
3:默认参数
def foo(x,y,z=3):
print (x,y,z)
foo(1,y=2)
或者 foo(1,2)
#默认参数必须跟在非默认参数后
#默认参数的值通常定义成不可变类型
#默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次
4:可变长参数
*args(一个星) 会把溢出的按位置定义的实参都接收,以元组的形式赋值给args
kwargs(俩个星) 会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs
def foo(x,y,*suibian): -->*后面随便写,最好写为args
print (x,y)
print (suibian)
foo(1,2,3,4,5,6,7,1)
变长参数会把里面的内容放到 一个元祖中
上面的调用结果 和这样写相同:
foo(1,2*[3,4,5,6,7,1]) -->在调用的时候使用* 会把后面的内容分别放入suibian 中
可以使用列表、集合、元祖、字典, 但是字典只会将key 提取出来
foo(1,2,*{'a':3,'b':4,'c':5})
如果想要 字典值:如下
foo(1,2,*{'a':3,'b':4,'c':5}.values())
如果想要k,v
foo(1,2,*{'a':3,'b':4,'c':5}.items())
处理结果:
1 2
(('c', 5), ('b', 4), ('a', 3))
kwargs
def foo(x,y,**kwargs):
# (x,y)print )
print (x,y)
print (kwargs)
foo(1,2,a=3,b=4,c=5)
在传递的时候 kwargs 的需要 以k=v 的形式传递 因为 kwargs 是以字典形式显示
函数的变量
局部变量和全局变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
total = 0; # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
#返回2个参数的和."
total = arg1 + arg2; # total在这里是局部变量.
print "函数内是局部变量 : ", total
return total;
#调用sum函数
sum( 10, 20 );
print "函数外是全局变量 : ", total
以上实例输出结果:
函数内是局部变量 : 30
函数外是全局变量 : 0
global 声明函数中的变量为全局变量,就可以对在函数外部进行使用
函数的返回值
函数被调用后会返回一个指定的值,函数调用后默认返回none
return语句[表达式]退出函数,选择性地向调用方返回一个表达式。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可写函数说明
def sum( arg1, arg2 ):
# 返回2个参数的和."
total = arg1 + arg2
print "函数内 : ", total
return total;
# 调用sum函数
total = sum( 10, 20 );
返回值可以是任意类型,return执行后,函数终止。
return与print,print 一般常用于测试,定义函数的目的,就是为了调用函数,其实主要也是为了能使用函数的返回值
多类型传值和冗余参数
* arg元组
**字典
加*
后就可以直接调用,且加*
的参数需要放在最后面
传值时,如果是字典,字典的key要和形参的名字一致
冗余参数
处理多余参数(接收多余参数)
def func(x,*args,**kwargs):
定义了x命名参数,和两个多类型参数,作为冗余参数
默认情况下至少传递一个命名参数,如果传的参数多的话,则存到args中(以元组的形式),如果传递的是字典,或者变量的默认(例x=1)值等(以字典的形式存储)
函数的递归调用
递归调用顾名思义即在函数内部调用函数(自己调用自己),通常用它来计算阶乘,累加等
注意:
- 必须有最后的默认结果
if n ==0,(不能一直调用自己,如果没有可能会造成死循环)
- 递归参数必须向默认的结果收敛
func(n-1)
举例
计算1到100的和
#!/usr/bin/env python
def func(n):
sum = 0
if n == 0:
return 0
else:
return n + func(n-1)
print func(100)
举例
#!/usr/bin/env python
import os
import sys
def print_file(path):
lsdir = os.listdir(path)
files = [ i for i in lsdir if os.path.isfile(os.path.join(path,i)) ]
dicts = [ i for i in lsdir if os.path.isdir(os.path.join(path,i)) ]
if files:
for i in files:
print os.path.join(path,i)
if dicts:
for f in dicts:
print_file(os.path.join(path,f))
print_file(sys.argv[1])