一.函数参数
1.函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码块。高复用,低耦合。
2.语法:
def 函数名(参数列表):
函数体
return xxx
可以返回多个值,返回的多个值组成一个元组,返回值加上一对中括号,则返回一个列表。
函数分为定义和调用
3.可更改(mutable)与不可更改(immutable)对象
string、tuples、numbers是不可更改对象
list、dict等是可以修改的对象
3.1.传递不可变类型:值传递(复制副本),如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部 修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
3.2.传递可变类型:引用传递,值传递传递的数据类型是 可变类型用值传递传递方式(复制内存地址的副本)去传递 可变类型-可改变内容 不可改变原地址如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la的内容也会受影响
4.调用函数时可使用的正式参数类型:
必选参数:(形参和实参一一对应,个数、数据类型、顺序)、
默认参数:(缺省参数)、缺省参数必须写在后面,可以不指定参数名,但是顺序要保证,否则要指定参数名、
可变参数:*args(不定长参数,允许传入0个或任意多个参数,这些可变参数在函数调用时自动组装为一个tuple)、
关键字参数:**kw(name=value允许传入0个或任意多个参数名的参数,这些关键字参数在函数内部自动组装成一个dict)、
参数组合:
参数定义的顺序必须是:必选参数、默认参数、可变参数、关键字参数
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw) f1(1,2,3,4,5,6,w=7,q=8)
运行结果
a = 1 b = 2 c = 3 args = (4, 5, 6) kw = {'w': 7, 'q': 8}
def f2(a, b, c=0, *, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) f2(1,2,(3,4,5),d=4)
运行结果
a = 1 b = 2 c = (3, 4, 5) d = 4 kw = {}
def f3(a, b, c=0, *arags, d, **kw): print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw) t=(1,2,3,4,5) f3(*t,d=9)运行结果
a = 1 b = 2 c = 3 d = 9 kw = {}
二.变量作用域:
分为全局变量和局部变量:
g_a = 20 def testl(): a = 10 global g_a #声明调用的是 全局变量 g_a = g_a+a print(a) testl() print(g_a)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py 10 30
全局变量和局部变量重名时,局部变量优先
c_m=10 def show(): c_m=30 #就近一致 print(c_m) show()
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py 30
即:局部变量特点===形参
三.匿名函数
语法lambda [参数列表]:函数体内部代码
lam = lambda : print('this is a lambda')
lam() #():来调用/执行
案例:加法
def Youfun(x,y,fun): print(fun(x,y)) def myfun(x,y): return x+y Youfun(10,20,myfun) # 更简单: Youfun(20,30,lambda x,y:x+y)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py 30 50 Process finished with exit code 0
循环输出
wu = lambda x:[print(i) for i in range(x)] wu(9)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py 0 1 2 3 4 5 6 7 8 Process finished with exit code 0
定义函数
def func(arg):
return arg + 1
执行函数
result = func(123)
my_lambda --》 lambda arg : arg + 1
执行函数
result = my_lambda(123)
四.大数据用到的函数:
python map():#逐个匹配 接收两个参数,一个是函数,
一个是序列,map将序列的每个元素传入函数中执行,并把结果作为新的map返回。
yu = list(map(lambda x:x+1,range(10))) print(yu)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Process finished with exit code 0
filter:过滤 即:筛选
案例:筛选偶数
list2 = [1,4,6,7,9,12,17] filterl = list(filter(lambda x:x%2==0,list2)) print(type(filterl)) print(filterl)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py <class 'list'> [4, 6, 12] Process finished with exit code 0
利于filter(),可以完成很多有用的功能,例如 删除 None 或者空字符串
strs = [None,'','','df','丫丫','啦啦'] '''' 过程: def isNone(s): return s and len(s.strip())>0 ''' strsl = list(filter(lambda s:s and len(s.strip())>0,strs)) print(strsl)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py ['df', '丫丫', '啦啦'] Process finished with exit code 0
利用filter()过滤出1-100的平方根是整数的数
import math filter1 = list(filter(lambda x:math.sqrt(x)%1==0,range(1,101))) print(filter1)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] Process finished with exit code 0
reduce:求和 即:# 接收的参数和 map()类似
import math,functools as f li=[11,22,33,44,55] red= f.reduce(lambda x,y:x+y,li,) print(red)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py 165 Process finished with exit code 0
python内置求和函数:sum
print(sum(li))
把值变成负数import math,functools as f li=[11,22,33,44,55] red= f.reduce(lambda x,y:x-y,li,0) print(red)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py -165 Process finished with exit code 0
自定义排序:复制数据不改变原数据 只从新排序
r = [1,5,2,8,3,9,4] new_r = sorted(r)#默认升序 print(new_r) print(r)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py [1, 2, 3, 4, 5, 8, 9] [1, 5, 2, 8, 3, 9, 4] Process finished with exit code 0
r = [1,5,2,8,3,9,4] new_r = sorted(r,reverse=True)#降序 print(new_r) print(r)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py [9, 8, 5, 4, 3, 2, 1] [1, 5, 2, 8, 3, 9, 4] Process finished with exit code 0
L = [('DFG', 75), ('ADF', 92), ('Bart', 66), ('Lisa', 88)] n_l = sorted(L) print(n_l) #排序列表,是以ASCII码比较
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py [('ADF', 92), ('Bart', 66), ('DFG', 75), ('Lisa', 88)] Process finished with exit code 0
L = [('55', 75), ('44', 92), ('Bart', 66), ('Lisa', 88)] #这个时候就得用指定key的方式排序: n_l = sorted(L,key=lambda x:x[1],) print(n_l)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py [('Bart', 66), ('55', 75), ('Lisa', 88), ('44', 92)] Process finished with exit code 0