*************************************************************************闭包函数*************************************************************************** 

一、闭包函数

闭:定义在函数内部的函数

包:内部函数引用了外部函数作用域的名字

给函数体传值的两种方式:

1.通过函数括号里面的参数 传值

 

2.函数的第二种方式 闭包

 

补充:爬虫,正常思路下代码重复率高。怎么来减少代码冗余

包:requests  

安装requests包  pip3  install  requests

爬虫的本质就是爬取页面的html代码,从中获取到你想要的数据(utl链接地址)

有了链接地址,你就可以顺着这个链接地址将所有的页面紫园全部爬写下来。

 

   *************************************************************************装饰器*************************************************************************** 

二、装饰器

器:是一种工具

装饰:给一个被装饰的对象添加新的功能

为什么会用到装饰器?

装饰器具有开放封闭原则:

装饰器遵循的两个原则:

1.不改变被装饰器的源代码

2.不改变装饰器调用时的调用方式

 

两个知识点:

Callable:可调用,即当遇到()时,立即执行调用

Time这个模块:

time.time() 获得的时间戳  从1970.1.1. 00.00开始到现在的秒数

time.sleep(seconds) 让程序暂停几秒钟              

 

装饰器语法糖:@+函数调用名 

 将紧挨着它的可调用对象的名字作为@后面跟着函数名里面的参数。

 

装饰器在装饰的时候是从上往下装饰,

装饰器在执行的时候是从下往上执行

 

有参装饰器和无参装饰器:

无参装饰器 装饰器就两层,最外层函数里面的参数只能用来传调用的函数名,当要在调用函数里面添加参数,只能在装饰器函数外部在装一层函数,函数里面的参数可以就是你想传的参数。

下图为有参函数,无参函数只要把最外层的去除就可

 

**这里需要注意:虽然这样可以实现我们想要的结果,但是当我们打印index值,返回的其实是inner指向的一个内容地址,不是真正index的地址,同时查看函数注释时,返回的也是inner里面的注释,查看函数名字符串形式(index._name_)

怎样来做到本来一家当真的现象真的是真的呢,这个就用到一个包 wraps

From   functools   import  wraps

 

   *************************************************************************函数的递归*************************************************************************** 

函数的递归

函数在调用阶段,直接或间接的又调用了自己

 

**首先先明确函数不能无限的递归下去

Python 解释器可以递归次数在998左右

怎么查看python解释器的递归次数呢?

1.自己编辑一个递归函数

2.通过一个模块 sys  可以查看python解释器的递归次数,同时也可以设置python解释器的递归次数

递归分为两个阶段

1.回溯:就是就是一次一次重复的过程,且每次重复过程的复杂度都应该下降,直到有一个最终的结束条件

2.递推:一次一次往回推的过程

递归函数不要考虑循环的次数,只要把握结束的条件即可

 

**例题:年龄递归为题,后面的人都比前面一个人大2岁,第五个人年龄20,求第一个人多少岁?用递归函数表示

Age(1) = agr(2) + 2

Age(2) = arg(3) + 2

Age(3) = arg(4) + 2

Arg(4) = arg(5) + 2

Arg(5) = 20

 

**函数体代码顶替方式:

  1. 用pass (推荐)

 ************************************************************************算法*************************************************************************** 

算法

用来高效率的解决问题

怎样查找一个数字在一个有序无重复的列表里面?

 

 

怎样快速检查一个数据在不在一个有序且没有重复数据列表里面?(二分法)

 

  *************************************************************************三元表达式*************************************************************************** 

三元表达式

格式:值1 if 条件 else 值2

条件成立 值1,条件不成立 值2

三元表达式的应用场景:只推荐只有两种的情况的可能下

 

 

 

res = [name for name in l if name.endswith('_sb')]  # 后面不支持再加else的情况

# 先for循环依次取出列表里面的每一个元素

# 然后交由if判断  条件成立才会交给for前面的代码

# 如果条件不成立 当前的元素 直接舍

 *************************************************************************字典生成式*************************************************************************** 

 

*************************************************************************常用的匿名函数*************************************************************************** 

匿名函数:没有名字的函数

关键字:lambda  如果将一个变量名指向 一个匿名函数时,可以用该变量名来调用

匿名函数的特点:

         临时使用,用完就结束了

 

*************************************************************************常用的内置函数***************************************************************** **********

字符转数字  ord()   ord(‘a’) = 97

数字转字符  chr()    chr(65) = A

常见的内置函数

Map、 zip 、 filter 、 sorted  、 reduce

Map:映射

 

 

Zip:拉链 若果每个环节缺一个,则缺的那一组不建立关系

 

 

Filter:过滤   返回的是一个对象

 

 

Sorted :反转 从小到大排序,同一类型

 

 

Reduce

插入一个模块  reduce

From  functools  import   reduce

 

 

posted on 2019-07-12 21:40  "莫欺少年穷  阅读(142)  评论(0编辑  收藏  举报