函数---以功能为导向

1.三元运算(简单,有结果,必须有if else)

a = 1
b = 2
c = a if a > b else b
print(c)

 ==左右判断是否相等和一致,is判断内存地址id()

2.函数

1.函数变量:

(1)动态变量 :*args 接收位置参数,组织成tuple

        **kwargs接收关键字参数,组成一个dict 

    PS:参数顺序:位置参数,*args,默认参数,**kwargs

      lis1 = [1,2,3,4,5,6,7]

      func(*lis1)  #站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散

2.闭包(嵌套函数,内部函数调用外部函数)基本格式:

def func1():
    a = 1
    def func2():
        print('a')
    return func2

func = func1()
func()

 优点:避免多次调用函数,局部变量a不断生成消失

名称空间:当程序执行时,将变量于值的的关系放在一个空间

临时名称空间:函数中的变量以及值的对应关系放在一个空间中,这个空间会随着函数结束而消失

内置名称空间:python自带的:包括内置函数等

全局作用域:内置名称空间和全局名称空间

局部作用域:临时名称空间

global:在函数中声明一个全局变量,在函数中修改一个全局变量

nonlocal:在函数中对父级或者更高级的变量进行修改,但是不能修改全局变量

函数名的运用:可以作为变量。可以作为容器类的元素,可以作为函数的参数,可以作为函数的返回值

3.一个修改文件的函数示例

def func1(f, old, new):
    with open(f, encoding='utf-8') as f1, open('%s.bak'%f, w,encoding='utf-8') as f2:
        for line in f1:
            if old in line:
                line = line.replace(old, new)
            f2.write(line)

import os
os.remove(f1)
os.rename('%s.bak'%f, f)

 4. 装饰器

 #不想修改函数的调用方式,但是还是想在函数前后添加功能,本质是闭包函数

 #原则:开放封闭原则

  开放:对拓展是开放的

  封闭:对修改是封闭的

 #语法糖: @装饰器函数名

      被装饰函数体

      被装饰函数调用

(1)一个装饰器wrapper的标准格式

from functools import wraps
def wrapper(f):
    @wraps(f)   
    def inner(*args,**kwargs):
        print(在被装饰函数之前做的事)
        ret = f(*args,**kwargs)
        print(在被装饰函数之后做的事)
        return ret
    return inner

@wrapper  #f = wrapper(f)
def f(*args, **kwargs):
     print(*args, **kwargs) 

 

 

(2)装饰器的进阶

func.__name__ #返回函数名的str格式

#带参数的装饰器

#多个装饰器装饰一个函数

 

5.迭代器(iterator)

#可迭代(iterable):数据类型拥有__iter__()方法就可迭代(可迭代协议);  __iter__()方法独有三种方法__setstate__(), __next__(), __length_hint__();

#迭代器协议---内部含有__iter__(), __next__()就是迭代器

#[]是可迭代的   [].__iter__()是迭代器

#for循环其实就是在使用迭代器

#迭代器的特点: #节省内存,惰性机制,一条路走到黑

#简单模拟for

1 lis = [1,2,1245,1243,346,34623,2352]
2 iterator = lis.__iter__()
3 try:
4     while 1:
5         print(iterator.__next__())
6 except StopIteration:
7     print('done')

 6.生成器----本质是迭代器

#生成器函数----含有yield关键字,必须写在函数里,不能和return共用

#从生成器中取值:__next__    for loop  数据类型强制转换  send(None)

#列表推导式和生成器表达式

 [i for i in range(30) if i %3 ==0]   返回一个列表

 [i for name in names for i in name if name.count('e') == 2]

 (i for in range(10))   返回一个生成器

#字典推导式

例:将dict key和value对调

mcase = {'a': 10, 'b': 34}

m_re = {mcase[k]: k for k in mcase}

#集合推导式

{x **2 for i in [1, -1, 2]} 自带去重

7.内置函数

 https://www.processon.com/mindmap/5c87ba86e4b02b2ce495b486

8.匿名函数

函数名 = lambda 参数 : 返回值 

 max min sorted filter map(会根据提供的函数对指定序列做映射)

 1 >>> def square(x) :            # 计算平方数
 2             return x ** 2
 3 
 4 >>> map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
 5 [1, 4, 9, 16, 25]
 6 >>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数
 7 [1, 4, 9, 16, 25]
 8  
 9 # 提供了两个列表,对相同位置的列表数据进行相加
10 >>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
11 [3, 7, 11, 15, 19]    

9.递归:自己调用自己,最大的作用就是遍历树形结构

递归深度最大997次,998次报错

10.二分查找

 

 

posted @ 2019-03-09 16:50  交出萌妹儿  阅读(252)  评论(0编辑  收藏  举报