一、函数

  通过函数,可以对特定的代码功能进行封装,实现代码的复用。

1、函数的声明(定义)

  def 函数名(参数列表):

    代码

 

  不带参数的函数定义:

    def printInfo():

      print('Hello world!!')

  带参数的函数定义:

    def print(a,b):

      return a+b

2、函数的调用

  调用方式: 函数名(实参列表)

 

   printInfo()

   sumV = add(10,20)  ## 这里传入的是实参

3、函数的返回值

  通过return返回函数的返回值

  函数中,默认return返回None,不写return也是返回None  ,return None也可以简写为return

  在函数中,无论在return后面是否有语句,遇到return整个函数就直接结束

  continue:结束本次循环,进入下一次循环

  break:

 

特别的地方:

  在python中可以一次返回多个值

 1 def move(x, y):
 2     return x+10,y+10
 3 
 4 ##定义两个变量接受返回值:
 5 x,y=move(12,20)
 6 print('x=%d,y=%d'%(x,y))
 7 
 8 ##定义一个变量接收返回值,返回值为元组类型:
 9 point=move(20,30)
10 print(point)
11 print(point[0])

4、参数传递

  python的所有变量的内容都是内存地址,也就是说变量指向内存的对象的一个指针

  都是值的引用,其类型分都是对象决定的

 (1) id函数:获取变量的地址

   a = 10

   print(id(a))  ##输出:1231232314

 (2)值类型:

   值类型对象本身不允许修改,数值的修改实际上让变量指向一个新的对象

   (也是就是数值本身的内容变成了另外一个新的内存地址)

  不可变对象包含:字符串、元祖、数值---- 这些都不允许修改 ,做参数传递的时候,在内部改变量的值,不能影响外部变量的值

1 a = 10
2 b = 20
3 def swap(x, y): ##传递的是值类型,函数内部修改参数的值,外部的变量没有作用
4 temp = x
5 x = y
6 y = temp
7 swap(a, b)
8 print(a, b) ##输出 :10 20

 (3)引用类型

  可变对象:列表、字典等,本身允许修改

  如果函数传递的是引用类型,在函数内操作直接影响到外部的变量

 5、局部变量全局变量

  1函数内部使用的变量称为局部变量

  2函数外定义的变量称为全局变量

    全局变量能够在所有的函数中进行访问

    如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错

    如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量(所谓强龙不压地头蛇)

 1 def test3():
 2     global b #使用global后,就可以对全局变量进行修改
 3     b = 100
 4     
 5 test3()
 6 print(b)
 7 
 8 li = [1,]
 9 def f2():
10     li.append(1)#如果全局变量是可变类型,函数内可以直接修改其内容
11     print(li)
12 f2()

 二、函数的参数

  1、位置参数

    传入的时候,按照定义的时候的位置依次传入。

1 def pow(x)
2     return x*x
3 
4 p = pow(10)
5 print(p)
6 #传参时,还可以指定参数名称,必须与函数定义中的一样
7 print(pow(x = 100))

  2、默认参数

    在定义函数的时候,可以设定默认参数。但是默认参数,要放在后面,否追报语法错误

1 def  pow(x,n=3):
2         xxx
3 
4 pow(10)  ## 这样x=10,n默认就等于3

  3、可变参数-

    传入的参数组成元祖!!

    允许你传入任意个参数,这些参数再掉用的时候,组装成了一个元祖(tuple)!!!

 1 def sum2(*args):## *args 任意长度,把接收到的全部数据最为元祖
 2     print(type(args))  ##args是元祖!!!
 3     sumV = 0
 4     for v in args: ## 可变参数
 5         sumV+=v
 6     print(sumV)
 7 
 8 sum2(1,2,3,4,5,6,7,8,9,0)
 9 
10 l = [2,3,4]
11 sum2(l[0],l[1],l[2]) ##这样不方便
12 sum2(*l) ###把列表中的元素,给sum2    
13          ### *[2,3,4] 将列表中的元素取出来,作为可变参数传给函数
14          ### 同样元祖也可以
15 l2 = (1,2,3)
16 sum2(*l2)
17 sum2(*[1,2,3,4,5])

  4、关键字参数

    允许你传入任意个参数,这些参数再调用的时候,组装成了一个字典(dict)!!!

 1 def person(**kw): ##内部处理成字典
 2     print(kw)        ##kw是一个字典
 3     # print(type(kw))
 4     # print(kw['name'])## 输出zhangsan
 5 
 6 person(name='zhangsan',age= '10')
 7 
 8 d = {'name':'zhangsan','age':11}
 9 person(**d) ## 把字典取出来,一个个传递进去
10             ## **d 相当于name='zhangsan',age= '11'
11 
12 ## 可以接收任意参数!!
13 ## 不方便写逻辑,不知道怎么处理
14 def test(*args,**kw): ##声明 args处理成元祖--包装
15     print(args)
16     print(kw)
17     #test1(*(10,20))
18 test1(*args,**kw)##调用-- 解开!!
19 
20 def test1(a,b):
21     print(a+b)
22 
23 # test(10,20)   ##输出:(10,20)
24 # test(10,a=20) ##输出:(10,)
25                 ##     {'a': 20}
26 
27 test(10,20)

 

三、递归

  函数内部自己调用自己,但是一定要有结束条件!!

1 求4的阶乘,4!=4*3! ,  3! = 3*2!, ...
2 def jiecheng(n):
3     if n==1:  ## 结束条件
4         return 1
5     return n * jiecheng(n - 1) ##n一定要改变
6 
7 s = jiecheng(3)
8 print(s)

 

四、匿名函数

  没有名字的函数叫匿名函数,也叫lambda函数

  语法: lambda 参数:表达式

    左边的参数可以有多个,但是右边的表达式只能有一个

    使用lambda函数时,需要一个变量接收结果

  lambda函数可以作为实参,传递给函数

 1 '''简单用法'''
 2 ## 匿名函数无法调用
 3 ## 通过赋值的方式,相当于给了名字
 4 add1 = lambda a, b :a+b
 5 print(add(10,20))
 6 
 7 ''' 匿名函数作为函数的参数传递'''
 8 
 9 def mul(a,b):
10     return a*b
11 
12 def calcute(a,b,func): ## 第三个参数表示传入函数变量
13     return func(a,b)
14 
15 ## 通过函数名传递函数!!!--普通!!
16 print(calcute(12,3,mul))
17 print(calcute(12,3,add))
18 
19 ## 传入lambda表达式 相当于func = lambda x,y:x+y 
20 print(calcute(10,50,lambda x,y:x+y))

  小例子:

1 = [(2,12),(6,23),(4,24)]
l.sort(key = lambda x :x[1],reverse=True)
print(l)
'''
    sort(key=None,reverse=None) ##自带默认参数默认从小到达排序
    key: 表示排序的条件,指定按照哪个排
    
    so, 匿名函数就是,把元祖的第二个取出来排
    ##  l.sort()  已经把列表元素取出来了,只需要再取元祖的第二个元素即可
'''

五、闭包

  一句话,内部函数调用外部函数的变量(一般是要装饰的函数名),返回内部函数的函数名!!(相关参数和变量都保存在返回的函数中)

  函数闭包的要素
  1、外部函数和内部函数
  2、内部函数使用外部函数的变量
  3、内部函数返回函数名()
  其他逻辑视情况而定!!

 1 ## 闭包实例!!
 2 def sum_out(*args):
 3     ## 定义内部函数
 4     def sum_in():
 5         ##使用外部函数的变量
 6         sumV = sum(args) ##元祖求和
 7         return sumV  # 返回结果
 8     return sum_in    ##返回函数
 9 
10 print(sum_out(1,2,3,4)())
11 
12 ss =sum_out(1,2,3,4) 
13 print(ss())  ## z真正调用的是sum_in()

六、装饰器

  就是在闭包的基础上,参数改为函数,该函数就是我们传递进来并且要装饰的对象。

 1 # 装饰器其实就是一个以函数作为参数并返回
 2 # 一个替换函数的可执行函数
 3 
 4 import time
 5 def add():
 6     # print('调用时间:%s' %time.strftime('%Y-%m-%d %H:%M:%s'))
 7     print('add')
 8 add()
 9 
10 print('-----------')
11 ## 装饰器的实现
12 def log(func):
13     def wrapper():
14         # print('调用时间:%s' %time.strftime('%Y-%m-%d %H:%M:%s'))
15         # print('调用%s时间:%s' %(func.__name__,time.strftime('%Y-%m-%d %H:%M:%s')))
16         print('调用:%s' %func.__name__)
17         func()
18     return wrapper
19 
20 add_warp = log(add)
21 add_warp()
22 
23 print('--------------')
24 def mul():
25     print('mul')
26 
27 mul_warp = log(mul)
28 mul_warp()
29 
30 
31 add = log(add)
32 add() ##这个已经不是原来的add    
33       ##已经被装饰了一回
34 
35 
36 ## 借助add语法,作用到指定函数
37 @log  ##装饰这个函数 相当于sub = log(sub)
38 def sub():
39     print('sub')
40 
41 sub() ## 实际上不是原来的sub,已经被装饰过一回!!
 1 ##带参数的装饰器
 4 import functools
 6 
 7 def log(func):
 8     ## 接受任意的参数
 9     ## 作用:wrapper变成了add wrapper.__name__=func.__name__
10     ### @functools.wraps(func) ##工具--- 加了这个原执行的表面wrapper 变成了add真实函数
11     def wrapper(*args,**kw): ##可变参数--任意参数
12         print('调用!!')    
13         # print('args=',args)
14         # print('kw=',kw)       ##若是没有就会返回None
15         return func(*args,**kw) ##通用写法 得到返回值 
16     return wrapper        
17 
18 @log   ##相当于 add = log(add)
19 def add(a,b):
20     return a+b 
21 
22 # add = log(add)  log(add)() =wrapper()
23 
25 print(add(10,30))
26 print(id(add))
27 add()
28 
29 print('----------------------------')
31 
32 aaa = log(add) 
33 print(aaa.__name__)  ##真正执行的函数是wrapper!!!!
34 
35 def add(a,b)
36     return 
37 
38 def aa(func):
39     def ssb():
41         return a+b
43     return ssb
44 
45 add()

 

*七、偏函数--- 基本没啥用

  把一个函数的某些参数给固定住(就是设置默认值),得到一个新的函数

八、高阶函数

  定义:一个函数接收另外一个函数作为参数,称之为高阶函数

  1、map() 函数

    将传入的函数作用到列表的每一个元素

    map(函数,可迭代对象)   一般搭配lambda或者自己定义函数

 1 def f(x):
 2     return x*x
 3 ## 1、2、3、4、.... 相当于f(1)、f(2)。。。。
 4 m = map(f,range(1,9)) ## map对象 ---可以被遍历
 5 for v in m:
 6     print(v) ##输出结果
 7 
 8 ##map和匿名函数
 9 m = map(lambda x:x+3,range(1,5))
10 for j in m:
11     print(j)

  2、reduce()函数

    对传入序列(作用于每一个元素)做累积运算

    格式:reduce(函数,可迭代对象),搭配lambda使用

 1 from functools import reduce ##引入函数
 2 def add(x,y):
 3     return x+y
 4 '''
 5 简单写法
 6 '''
 7 r = reduce(add,[1,2,3])
 8 print(r)   # 输出:6
 9 
10 '''
11 reduce 搭配lambda ,更简单的写法
12 '''
13 
14 r2 = reduce(lambda x,y:x+y,[1,2,3])
15 print(r2)    ##输出:6

 

  3、filter()函数---过滤

    用于过滤序列,他把传入的函数作用于每一个元素,如果是True就保留该元素,Flase去掉该元素

 1 ##得到列表中的偶数
 2 
 3 '''
 4 普通写法
 5 '''
 6 z= [3,2,12,4,23,57,13]
 7 
 8 def t(x):
 9     return x%2==0
10 
11 b = filter(t,z)
12 print(b)
13 
14 ''''
15 高级写法
16 ''''
17 a = filter(lambda x:x%2==0,z)
18 print(a)

 

  

  

 

posted on 2018-03-09 11:54  虫子小孩  阅读(303)  评论(0编辑  收藏  举报