没有合适的资源?快使用搜索试试~ 我知道了~
首页Python 难点重点学习笔记
Python 难点重点学习笔记
需积分: 50 20 下载量 44 浏览量
更新于2023-03-16
评论 4
收藏 1.5MB PDF 举报
Python学习过程中,遇到的python难点、重点问题的学习笔记,以及一些有助于理解的好的内容。包括:list、tupe、dict、set区别、特点,用法;高级特性,包括切片、列表生成式,生成器、迭代器,函数式编程,包括高级函数、map、reduce、filter、sorted;返回函数、匿名函数、偏函数、装饰器的深入理解。面向对象高级编程等。
资源详情
资源评论
资源推荐
1
一、Python 基础
List
Python 内置的一种数据类型是列表:list。list 是一种有序的集合,可以随时添加和删除其中的元素。
>>> classmates = ['Michael', 'Bob', 'Tracy']
tuple
另一种有序列表叫元组:tuple。tuple 和 list 非常类似,但是 tuple 一旦初始化就不能修改,比如同样是列出同学的
名字:
>>> classmates = ('Michael', 'Bob', 'Tracy')
dict
Python 内置了字典:dict 的支持,dict 全称 dictionary,在其他语言中也称为 map,使用键-值(key-value)存
储,具有极快的查找速度。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
和 list 比较,dict 有以下几个特点:查找和插入的速度极快,不会随着 key 的增加而变慢;需要占用大量的内存,内存
浪费多。
而 list 相反:查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。
所以,dict 是用空间来换取时间的一种方法。
set
set 和 dict 类似,也是一组 key 的集合,但不存储 value。由于 key 不能重复,所以,在 set 中,没有重复的 key。
>>> s = set([1, 2, 3])
set 和 dict 的唯一区别仅在于没有存储对应的 value,但是,set 的原理和 dict 一样,所以,同样不可以放入可变对
象,因为无法判断两个可变对象是否相等,也就无法保证 set 内部“不会有重复元素”。试试把 list 放入 set,看看是
否会报错。
二、高级特性
切片
对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python 提供了切片(Slice)操作符,能大大简化这种操作。
通常一个切片操作要提供三个参数 [start_index: stop_index: step]
start_index 是切片的起始位置
2
stop_index 是切片的结束位置(不包括)
step 可以不提供,默认值是 1,步长值不能为 0,不然会报错 ValueError。
>>> m = list(range(100))#通过 range 函数创建一个 0-99 的数列,组成一个 list 赋值给 m
>>> m
[0, 1, 2, 3, 4, 5, 6, „„,99]
>>> m[:10]#取前十个数
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> m[-10:]#取后十个数
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> m[10:20]#取前 11-20 个数
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> m[:10:2]#前十个数中,每 2 个数取一个
[0, 2, 4, 6, 8]
>>> m[5:15:3]#第 6-15 个数中,每 3 个数取一个
[5, 8, 11, 14]
>>> m[::10]#所有的数中,每 10 个数取一个
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> m[:]#什么都不写,可以原样复制一个 list
[0, 1, 2, 3, 4, 5, 6, 7,„„,99]
迭代
如果给定一个 list 或 tuple,可以通过 for ... in 来实现循环遍历,这个循环我们就叫做迭代,Python 中,只要是
可迭代对象,无论有无下标,都可以迭代
>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> for key in d:
... print(key)
列表生成式
列表生成式即 List Comprehensions,是快速生成一个列表的一些公式。
1、基础语法格式:[exp iter_var in iterable]
工作过程:
迭代 iterable 中的每个元素;
每次迭代都先把结果赋值给 iter_var,然后通过 exp 得到一个新的计算值;
最后把所有通过 exp 得到的计算值以一个新列表的形式返回。
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2、带过滤功能语法格式:[exp iter_var in iterable if_exp]
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
3、还可以使用两层循环,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
3
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器
列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的
list,从而节省大量的空间。在 Python 中,这种一边循环一边计算的机制,称为生成器:generator,生成器保存的是
算法。要创建一个 generator,有很多种方法。
1、第一种方法,只要把一个列表生成式的[]改成(),就创建了一个 generator:
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
创建 L 和 g 的区别仅在于最外层的[]和(),L 是一个 list,而 g 是一个 generator。
2、另一种方法,如果一个函数定义中包含 yield 关键字,那么这个函数就不再是一个普通函数,而是一个 generator:
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>
generator 和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成
generator 的函数,在每次调用 next()的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继
续执行。请注意区分普通函数和 generator 函数,普通函数调用直接返回结果:
>>> r = abs(6)
>>> r
6
generator 函数的“调用”实际返回一个 generator 对象:
>>> g = fib(6)
4
>>> g
<generator object fib at 0x1022ef948>
列表生成式和列表生成器区别:
列表生成式: 会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,会占用过多的内存空间。
列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如果需要序号获取数据,可以使用
next()函数来获取,但要注意,一旦 next()函数获取不到数据,会导致出现 StopIteration 异常错误,可以使
用 for 循环遍历生成器对象,获取所有数据视情况而定,如果数据量比较大,推荐使用生成器;(生成器中的元素是
按照指定的算法推算出来的,只有调用时才生成相应的数据。这样就不必一次性地把所有数据都生成,从而节省了大
量的内存空间,这使得其生成的元素个数几乎是没有限制的,并且操作的返回时间也是非常快速的(仅仅是创建一个
变量而已))。
迭代器
一、什么是迭代器
迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样)。迭代器是实现了__next__()方法的对象(这个方法
在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序列的第一个元素开始访问,直到所有的元素都被
访问才结束。 [注意]:迭代器只能前进不能后退
[迭代器的优点]:
使用迭代器不要求事先准备好整个迭代过程中的所有元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之
后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。
二、创建迭代器
A、使用内建的工厂函数 iter(iterable)可以将可迭代序列转换为迭代器
1 a=[1,2,3,4]
2 b=(1,2,3)
3 str='Tomwenxing'
4 (iter(a))
5 (iter(b))
6 (iter(str))
B、自定义迭代器
Python 中迭代器的本质上每次调用__next__()方法都返回下一个元素或抛出 StopIteration 的容器对象
由于 Python 中没有“迭代器”这个类,因此具有以下两个特性的类都可以称为“迭代器”类:
1、有__next__()方法,返回容器的下一个元素或抛出 StopIteration 异常
2、有__iter__()方法,返回迭代器本身
#斐波那契数列
class Fabs():
def __init__(self,max):
self.max=max
self.n,self.a,self.b=0,0,1
def __iter__(self):#定义__iter__方法
return self
def __next__(self):#定义__next__方法
5
if self.n<self.max:
tmp=self.b
self.a,self.b=self.b,self.a+self.b
#等价于:
#t=(self.a,self.a+self.b)
#self.a=t[0]
#self.b=t[1]
self.n+=1
return tmp
raise StopIteration
print(Fabs(5))
for item in Fabs(10):
print(item,end=' ')
三、迭代器的方法
1.iter.__next__():返回迭代器的下一个元素,但没有下一个元素时抛出 StopIteration 异常
1 list=[1,2,3,4]
2 list=iter(list)
3 (list.__next__())
4 (list.__next__())
5 (list.__next__())
6 (list.__next__())
7 (list.__next__())
2.iter.__iter__():返回迭代器对象本身
1 list=[1,2,3,4]
2 list=iter(list)
3 (list.__iter__())
四、迭代器的特点:
a)访问者不需要关心迭代器内部的结构,仅需通过 next()方法或不断去取下一个内容
b)不能随机访问集合中的某个值,只能从头到尾依次访问
c)访问到一半时不能往回退
d)便于循环比较大的数据集合,节省内存
剩余47页未读,继续阅读
谁会?
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0