函数
1.函数是组织好的,可重复使用的,用来实现单一,或相关联动功能的代码段
2.语法:
def 函数名(参数列表):
函数体
reture xxx
def fn1(a,b):
sum=a+b;
print(sum);
fn1(1,2);
>>> 3
def fn1(a,b):
print("函数内部:",a+b);
return a+b;
num=fn1(1,2);
print(num); (return返回值打印的num);
>>> 函数内部:3
3.
def fun(nums):
nums[0]="张飞";
nums[1]="刘备";
nums=["李逵","松江"];
print("调用前:",nums)
>>> ['李逵', '松江']
fun(nums)
print("调用后:",nums)
>>> ['张飞', '刘备']
4.以下是调用函数时可使用的正式参数类型;
必选参数
形参和实参一一对应(个数,数据类型,顺序)
形参:定义方法时的参数
实参:调用方法时的参数
形参和实参一一对应(个数,数据类型,顺序)
形参:定义方法时的参数
实参:调用方法时的参数
(以实参为准,若没实参有形参,则结果为形参为准)
def fun1(a=3,b=2):
'''
:param a 第一个加数:
:param b:第二个加数
:return: a+b的和
'''
return a+b;
h=fn1(4,4);
print(h);
>>> 8
(缺省参数)缺省参数必须写在后面,可以不指定参数名,但是顺序要保证,否则要指定参数名
def printinfo( name, age = 35 ):
print ("名字: ", name);
print ("年龄: ", age);
return;
printinfo('ok');
>>> 名字: ok
年龄: 35
不定长参数(可变参数):
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple(用*标书);
def GetSum(*nums):
sum=0;
for i in nums:
sum+=i;
return sum;
s=[2,3,4,5];
t=(2,3,4,5,6,7,8)
print(GetSum())
print(GetSum(*s))
print(GetSum(*t))
>>> 0
14
35
命名关键字参数
1.一旦以name=value的传参数的形式存在 以后都要以这种形式存在
2.name=value的传参数的形式 不要求顺序
def show(name,age,sorce=90):
print('姓名:{} 年龄:{}成绩:{}'.format(name,age,sorce))
show('OK',30)
show(age=30,name='OK')
show(sorce=80,age=30,name='OK')
show('OK',name='ok',age=30)
>>> 姓名:OK 年龄:30成绩:90
姓名:OK 年龄:30成绩:90
姓名:OK 年龄:30成绩:80
抛异常
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict;
关键字参数:**kw
**kw拷贝原内容,改动不会影响到函数外的extra;
def student(name,age,**kw):
kw.clear()
print('姓名{} ,年龄{} other:{}'.format(name,age,kw))
#值传递
def fun3(kw):
kw.clear();
student('tom',30,hao='篮球',ai='足球');
dic={'一':123,'二':223,'三':333}
student('ok',30,**dic)
print(dic)
dic2={'一':123,'二':223,'三':333}
fun3(dic2)
print(dic2)
>>> 姓名tom ,年龄30 other:{}
姓名ok ,年龄30 other:{}
{'一': 123, '二': 223, '三': 333}
{}
参数组合
def f1(a,b,c=0,*args,**kw):
print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)
args=(1,2,3,4)
f1(args);
>>> a = 1 b = 2 c = 3 args = (4,) kw = {}
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
>>> a = A b = B c = 0 args = () kw = {'d': 99, 'x': '#'}
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args,**kw)
>>> a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
函数的作用域
原因就是: 位置不同-->作用域不同,全局变量与局部变量的作用域不同 生命周期不同;
g_a=10;#全局变量
def changeNum(g_a):
# g_a=5;#局部变量
print("函数内部:",(g_a+10))
#
# print("调用前:",g_a)
# changeNum(1)
# print("调用后:",g_a)
>>> 调用前:10
函数内部: 11
调用后: 10
#当全局变量和局部变量同名时,局部变量优先 -->就近一致原则
5.匿名函数:
python 使用 lambda 来创建匿名函数;
(函数体内调用函数也叫高阶函数)
sum=lambda a,b:a*b;
s=sum(2,3);
print(s);
>>> 6
def dfdsfe(a,b):
return a+b;
def add(a,b,fun):
print(fun(a,b));
add(11,22,dfdsfe)
>>> 33
6.filter()过滤函数:
接收一个函数一个序列,将序列中的元素应用到函数内,返回值为真则保留,为假则丢弃。
当我在执行filter函数的时候,一直报<filter object at 0x03000750>。我的环境是Python3.6
应该讲filter函数转换成list;
def chint (x):
return isinstance (x ,int)
lis = [1,2,'yao',3,'yi']
a = filter (chint , lis)
print(list(a))
>>> [1,2,3]
7. map()函数将序列的每个元素传入函数中执行,并把结果作为新的list返回。
foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
print(list( map(lambda x:x%2,foo)))
>>> [0, 0, 1, 0, 1, 0, 0, 0, 1]
需导入模块 import fucntools,reduce在Python3.6中需要导入模块
n = 5
print reduce(lambda x, y: x * y, range(1, n + 1))
>>> 120
9.sort()和sorted的区别;
sort()函数改变的是原列表的排序,sorted()函数相当于复制原列表后,重新排序;
在sorted中,reverse=True表示降序排列 reverse=False 升序排列;
li=[25,2,99,45,87,5,1,5,8,45,26];
ol=li.sort();
ul=sorted(li)
print(ul)
print(ol)
>>> [1, 2, 5, 5, 8, 25, 26, 45, 45, 87, 99]
None
li=[25,2,99,45,87,5,1,5,8,45,26];
li.sort();
ul=sorted(li,reverse=True)
print(ul)
print(li)
>>> [99, 87, 45, 45, 26, 25, 8, 5, 5, 2, 1]
[1, 2, 5, 5, 8, 25, 26, 45, 45, 87, 99]
li=[("tom",82),("jack",66),("marry",90),("rose",70)];
li.sort();
ul=sorted(li,key=lambda s:s[1],reverse=True)
print(ul)
print(li)
>>> [('marry', 90), ('tom', 82), ('rose', 70), ('jack', 66)]
[('jack', 66), ('marry', 90), ('rose', 70), ('tom', 82)]