# 函数使用

### 生成器

- 使用场景

  在使用列表时,很多时候我们不会一下子使用全部数据,通常都是一个一个使用,但是当数据量比较大的时候,定义一个大的列表将会是内容使用突然增大。为了解决此类问题,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 生成器的更多相关文章

  1. python学习8—函数之高阶函数与内置函数

    python学习8—函数之高阶函数与内置函数 1. 高阶函数 a. map()函数 对第二个输入的参数进行第一个输入的参数指定的操作.map()函数的返回值是一个迭代器,只可以迭代一次,迭代过后会被释 ...

  2. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  3. Python学习之--函数/生成器/装饰器

    Function,函数,主要是为了:1提高代码的复用程度,2将程序模块化. 定义函数 在Python中,使用def 用来定义函数,一般函数的定义如下: def name(arg1,arg2,....) ...

  4. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  5. Python学习之路——迭代器、生成器、算法基础、正则

    一.迭代器: 迭代器是访问集合元素的一种方式. 迭代器对象是从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 另外,迭代 ...

  6. Python学习笔记010_迭代器_生成器

     迭代器 迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器. 常见的迭代器有 (列表.元祖.字典.字符串.文件 等),通常 ...

  7. Python学习(三):迭代器、生成器、装饰器、递归、算法、正则

    1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...

  8. 从0开始的Python学习007函数&函数柯里化

    简介 函数是可以重用的程序段.首先这段代码有一个名字,然后你可以在你的程序的任何地方使用这个名称来调用这个程序段.这个就是函数调用,在之前的学习中我们已经使用了很多的内置函数像type().range ...

  9. python学习Day10 函数的介绍(定义、组成、使用)

    今日学习内容: 1.什么是函数 :函数就是一个含有特定功能的变量,一个解决某问题的工具 函数的定义:通过关键字def + 功能名字():代码体(根据需求撰写代码逻辑) 2.为什么要用函数:可以复用:函 ...

随机推荐

  1. 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)

    点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...

  2. Uva 12169 不爽的裁判 模运算

    题目链接:https://vjudge.net/contest/156903#problem/B 题意: 有一个递推公式 : a,b都不是已知的,给出了 x1,x3,x5.... 求x2,x4,x6. ...

  3. 第9章 初识HAL固件库

    本章参考资料:<STM32F76xxx参考手册>.<STM32F7xx规格书>.<Cortex-M3权威指南>, STM32 HAL库帮助文档:<STM32F ...

  4. 遗忘的html标签

    <span>x</span><sup>2</sup><span>+y=10</span> <br> <span ...

  5. 2.Mysql集群------Mycat读写分离

    前言: Mycat: 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一 ...

  6. 使用session处理用户搜索后数据的上一页和下一页跳转

    搜索语句界面: /*单一检索:此处为一个下拉列表的检索*/ if(isset($_POST['submit']) && $_POST['submit'] == '点击搜索') { if ...

  7. 关于props的注意事项!

    起于昨晚大半夜在群里看到有人问这个问题,在子组件的data属性里重新赋值props属性 this.a = this.propA,不生效! 提示了他如果是异步的话,就要注意watch.决定今日敲个dem ...

  8. 《JSON笔记之二》----封装JSONUtil

    许多java开发人员对于fastjson再也熟悉不过了,这是alibaba开源的依赖,使用fastjson可以使我们很容易的把请求json串转换成为我们所需要的对象.list.map等对象格式,对于开 ...

  9. JQuery制作网页—— 第一章 JavaScript基础

    1. JavaScript(弱类型语言):是一种描述性语言,也是一种基于对象(Object)和事件驱动(Event Driven)的,并具有安全性能的脚本语言. 特点:1.主要用来在HTML页面中添加 ...

  10. 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化

    永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...