python学习总结---函数使用 and 生成器
# 函数使用
### 生成器
- 使用场景
  在使用列表时,很多时候我们不会一下子使用全部数据,通常都是一个一个使用,但是当数据量比较大的时候,定义一个大的列表将会是内容使用突然增大。为了解决此类问题,python中引入了生成器的概念。
- 使用方式
  - 方式1:将列表生成式的[]改为()
  ```python
  # 列表生成式
  # lt = [i for i in range(10)]
  # 生成器方式1:将列表生成式的[]改为()
  lt = (i for i in range(3))
  1.# 可以转换为列表
  # print(list(lt))
  2.# 可以进行遍历
  # for i in lt:
  #     print(i, end=' ')
  3.# 可以一个一个提取,当遍历完毕后再使用next会报StopIteration错
  print(next(lt))
  print(next(lt))
  print(next(lt))
  ```
  - 方式2:在函数中是使用yield
    ```python
    def test(n):
          for i in range(1, n+1):
              # 执行到此处,函数会返回yield后的值,然后停在这里
              yield i
      t = test(3)
      # print(t)
      # 可以使用next一个一个提取
      # print(next(t))
      # print(next(t))
      # print(next(t))
      # print(next(t))
      # 可以遍历
      # for i in t:
      #     print(i)
      # 可以转换为列表
      print(list(t))
    ```
- 总结:
  - 生成器对象保存的特定数据的生成算法,但并不是保存所有的数据
  - 生成器使用任意一种方式操作,都只能操作一遍
  - 生成器可以做的操作:遍历、转换为列表、next
### 迭代器
- 定义:能够使用for-in进行遍历,并且能够使用next依次获取其中一个元素。
- 说明:
  - 生成器就是一种特殊的迭代器
  - 判断一个对象是不是迭代器
  ```python
  from collections import Iterator
  # lt = [i for i in range(10)]
  lt = (i for i in range(10))
  print(isinstance(lt, Iterator))
  ```
  - 字符串、列表、元组、字典等都不是迭代器,它们都是可迭代对象。
### 可迭代对象
- 定义:可以使用for-in进行遍历的对象,都是可迭代对象。
- 说明:
  - 前面学过的容器类型都是可迭代对象。
  - 迭代器一定是可迭代对象
- 判断:一个对象是否可迭代
  ```python
  from collections import Iterable
  lt = [1, 2, 3]
  print(isinstance(lt, Iterable))
  ```
- iter:将可迭代对象转换为迭代器
  ```python
  from collections import Iterable, Iterator
  lt = [1, 2, 3]
  # 将一个可迭代对象转换为迭代器
  lt = iter(lt)
  print(isinstance(lt, Iterable))
  print(isinstance(lt, Iterator))
  ```
### 高级函数
- map
  - 参数
  ```
  func:一个函数
  iter1:一个可迭代对象
  ```
  - 使用:
  ```python
  from collections import Iterator
  lt = [1, 2, 3, 4, 5]
  def pingfang(x):
      return x * x
  # 返回一个迭代器
  ret = map(pingfang, lt)
  # ret = map(lambda x: 2 * x, lt)
  print(isinstance(ret, Iterator))
  print(list(ret))
  ```
  - 练习:
    - 熟悉字符串的函数:strip、lstrip、rstrip
    - ```python
      #熟悉字符串的函数:strip、lstrip、rstrip
      str = '  LOVE   '
      #去掉字符串中的空格
      #a = str.strip()
      #删除左边的
      #a = str.lstrip( 'B')
      #删除右边的
      a = str.rstrip()
      print('AAA'+a+'BBB')
      ```
      
    - 使用map函数:将一个元素全是字符串的列表进行处理,删除元素前后的空白,首字母大写
    - ```python
      a = ['  iloveyou   ']
      b = [a[0].strip()]
      def shanchu(x):
          return x[0].upper() + x[1:].lower()
      print(list(map(shanchu,b)))
      ```
      
- filter
  - 参数
  ```
  function:过滤函数
  iterable:可迭代对象
  ```
  - 使用:
  ```python
  lt = [1, 2, 3, 4, 5]
  def oushu(x):
      return x%2 == 0
  # f = filter(oushu, lt)
  f = filter(lambda x: x%2 != 0, lt)
  print(list(f))
  ```
  - 练习:提取列表中长度大于3的字符串,列表中什么元素都有
  - ```python
    第一种:
    lt = ['a','ab','abc','abcd',12345,235]
    def shuzi(x):
        return isinstance(x,str) and len(x) > 3
    f = filter(shuzi,lt)
    print(list(f))
    第二种:
    lt = ['a','ab','abc','abcd',12345,235]
    f = list(filter(lambda s:isinstance(s,str) and len(s) > 3,lt))
    print(list(f))
    ```
    
- reduce
  - 参数
  ```
  function:处理函数
  sequence:序列(容器对象)
  ```
  - 说明:
  ```
  1.首先从序列中取出两个元素,作为处理函数的参数
  2.处理完的结构与下一个元素进行使用处理函数处理
  3.处理结束,将处理完的结果返回
  ```
  - 使用:
  ```python
    from functools import reduce
    lt = [1, 2, 3, 4, 5]
    def add(a, b):
        return a + b
    # ret = reduce(add, lt)
    # 转换为12345
    ret = reduce(lambda x, y: x * 10 + y, lt)
    print(ret)
  ```
  - 练习:求一个列表中所有元素的乘积
  - ```python
    from functools import  reduce
    lt = [1,2,3,4,5]
    ret = reduce(lambda  x , y : x*y,lt)
    print(ret)
    ```
    
- sorted
  - 说明:
    - 排序函数,支持逆序和任意元素排序
    - 返回新的排序后的列表,不会改变原列表
    - 使用方式与列表的排序方法一样
    - 与我们自己实现的稍有不同
### random
- 示例:
  ```python
  import random
  #生成指定范围内的随机整数
  print(random.randint(1,10))
  #生成某一范围内的随机小数
  print(random.random())
  #生成指定位置内的随机小数
  print(random.uniform())
  #从容器对象(列表或字符)串中随机抽取一个元素
  it=[1,2,3,4,5,6,7,8,9,0]
  print(random.choice(it))
  #从容器对象中随机提取两个元素;指定个数
  print(random.sample([1,2,3,4,5],2))
  #sample 提取个数为一的情况 等价于上面提取个数为一的函数
  print(random.choices('absajbdsad'))
  #随机提取一个列表
  it=[1,2,3,4,5,6,]
  random.shuffle(it)
  print(it)
  ```
### 练习
- 使用random函数实现randint函数的功能,函数名:def my_randint(start, end)
- ```python
  import  random
  def rand_int(m,n):
     return round(random.random() *(n-m)+m)
  print(rand_int(1,10))
  ```
  
- 生成指定长度指定类型的随机字符串,参数:长度、类型
- ```python
  第一种:
  import random
  def random_str(n):
       str1 = ""
       base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
       length = len(base_str)-1
       for i in range (n):
           str1 += base_str[random.randint(0,length)]
       return  str1
  f = random_str(24)
  print(f)
  第二种:
  import  random
  def rand_str(lenght=4,kind=0):
      if kind == 0 :   #纯数字
          base_str = '1234567890'
      elif kind == 1 :  #纯字母
          base_str = 'askdrjnfk'
      else:              #数字字母混合
          base_str = '41ss4e5rtg56h'
      return  ''.join(random.choice(base_str)  for i in range(lenght))
  print(rand_str(3,2))
  ```
  
- 字符串转换,如:`IloveYOUmoreTHANiCANsay` => `I love you more than i can say`
- ```python
  第一种:
  def sep_words(s):
      ret = s[0].upper()
      for i in range(1,len(s)):
           if s[i].islower() == s[i-1].isupper():
               ret += ' '
           ret += s[i].lower()
      return  ret
  print(sep_words('IloveYOUmoreTHANiCANsay'))
  第二种:
  def sep_words(s):
     ret = s[0]
     for i in range(1,len(s)):
       if s[i].islower() == s[i-1].isupper():
          ret += ' '
       ret += s[i]
     return  ret.capitalize()
  print(sep_words('IloveYOUmoreTHANiCANsay'))
  ```
  
- 将列表中的元素完成特定的向右移动,参数:列表、移动长度
  - 如:`[1, 2, 3, 4, 5]`,移动2,结果:`4, 5, 1, 2, 3`
  - ```python
    第一种:
    def right_shuft(lt,step):
         step = step%len(lt)
         for i in range(step):
          #弹出最后一个元素
             last = lt.pop()
             #将最后一个元素插入到开头
             lt.insert(0,last)
    lt = [1,2,3,4,5]
    right_shuft(lt,2)
    print(lt)
    第二种:
    def right_shift(lt,step):
        step %= len(lt)
        left = lt[:-step]
        right = lt[-step:]
        lt.clear()
        lt.extend(right)
        lt.extend(left)
    lt = [1,2,3,4,5]
    right_shift(lt,2)
    print(lt)
    ```
    
- 使用递归,完成传入n,返回`1! + 2! + 3! + ... + n!`
- ```python
  #f(n) => f(n-1) + n!
  #f(n) => f(n-1) + n * (n-1)!
  #f(n) => f(n-1) + n * (f(n-1)-f(n-2))
  def jiechenghe(n):
       if n == 1:
         return  1
       elif n == 2:
         return  3
       return  jiechenghe(n-1)+ n * (jiechenghe(n-1)-jiechenghe(n-2))
  print(jiechenghe(1))
  print(jiechenghe(2))
  print(jiechenghe(3))
  ```
  
												
											python学习总结---函数使用 and 生成器的更多相关文章
- python学习8—函数之高阶函数与内置函数
		
python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...
 - python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
		
python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...
 - Python学习之--函数/生成器/装饰器
		
Function,函数,主要是为了:1提高代码的复用程度,2将程序模块化. 定义函数 在Python中,使用def 用来定义函数,一般函数的定义如下: def name(arg1,arg2,....) ...
 - python学习笔记四 迭代器,生成器,装饰器(基础篇)
		
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
 - Python学习之路——迭代器、生成器、算法基础、正则
		
一.迭代器: 迭代器是访问集合元素的一种方式. 迭代器对象是从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 另外,迭代 ...
 - Python学习笔记010_迭代器_生成器
		
迭代器 迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器. 常见的迭代器有 (列表.元祖.字典.字符串.文件 等),通常 ...
 - Python学习(三):迭代器、生成器、装饰器、递归、算法、正则
		
1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...
 - 从0开始的Python学习007函数&函数柯里化
		
简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...
 - python学习Day10 函数的介绍(定义、组成、使用)
		
今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...
 
随机推荐
- 过河问题(POJ1700)
			
题目链接:http://poj.org/problem?id=1700 解题报告: 1.贪心算法,每次过两个速度最慢的人,抵消那个较慢的人的时间. #include <stdio.h> # ...
 - 【转】Activity生命周期详解
			
三个循环 提供两个关于Activity的生命周期模型图示帮助理解: 图1 图2 从图2所示的Activity生命周期 ...
 - mac home brew install go
			
mac利器home brew安装Go 首先你得需要安装home brew和ruby环境(因为home brew依赖ruby) 如果没有请自行到链接安装 准备好之后就开始安装go了 brew updat ...
 - 关于vue中的nextTick深入理解
			
定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新 ...
 - JS - CommonJS、AMD、CMD
			
CommonJS CommonJS是一种JS模块定义规范,它出现之初是为了解决JS天生没有模块管理的缺陷,它的终极目标是提供一个类似Python.Ruby和Java标准库.NodeJS的模块系统就是参 ...
 - mysql 创建用户、授权、修改密码
			
以下操作都要在mysql所在机器操作 一.创建用户 CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; 或 insert into mysql. ...
 - xml的应用与dtd约束
			
1.xml的应用 *不同的系统之间的传输数据(qq消息传输) *用来表示生活中有关系的数据(省市区的包含关系) *经常用在文件配置 **比如现在连接数据库,肯定知道数据库的名称和密码及用户名. ...
 - jira安装说明
			
阅读目录 1.1 jira说明 1.2 安装配置jira 1.3 web界面访问 1.4 创建第一个项目 1.5 参考文献 回到顶部 1.1 jira说明 JIRA是Atlassian公司出品的项目与 ...
 - 【数据库】MySQL 从安装到命令
			
一, MySQL 的安装于配置 我是通过百度云盘的方式下载的.建议登录百度云终端,然后点击下面的链接,选择要安装的版本,解压安装. http://www.h2ero.cn/pan/share/17cd ...
 - 【文件处理】xml 文件 SAX解析
			
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口. 与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式. 当使用SAX分析器对XML文档 ...