Python学习笔记

阿里云2000元红包!本站用户参与享受九折优惠!

Python学习笔记

模块

  1. 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package);引入包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突;每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码。
    注意:自己创建模块时要注意命名,不能和Python自带的模块名称冲突。
  2. 模块名要遵循Python变量名规范
  3. 任何模块代码的第一个字符串都被视为模块的文档注释
  4. 使用__author__变量把作者写进去

作用域

类似__xxx__这样的变量是特殊变量,可以直接引用,但是有特殊用途,我们自己的变量一般不要用这种变量名;
类似_xxx__xxx这样的函数或变量就是非公开的(private),不应该被直接饮用

面向对象编程

类和实例

由于类可以起到模板的作用,因此,可以再创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法(注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以吧各种属性绑定到self,因为self就指向创建的实例本身。有了__init__方法,在创建实例的学习,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。)

2019-11-9

1. collections库和choice库

collections.namedtuple是一个工厂函数,它可以用来构建一个带字段名的元组和一个有名字的类——这个带名字的类对调试程序有很大帮助

import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
#构建了一个类名为Card,类中有两个变量
>>> beer_card = Card('7', 'diamonds')
>>> beer_card
Card(rank = '7', suit = 'diamonds')
>>> from collections import namedtuple
>>> City = namedtuple('City', 'name country population coordinates') 
>>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667)) 
>>> tokyo
City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722,
139.691667))

调用collections库,用collections.namedtuple构建了一个简单的类来表示一张牌。

from random import choice
#random.choice是一个从一个序列中随机选出一个元素的函数

2. repr函数

Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,这就是“字符串表示形式”。如果没有实现__repr__,当我们在控制台里打印一个响亮的实例时,得到的字符串可能会是<Vector object at 0x10e100070>

3. 列表推导和生成器表达式

(1)列表推导是构建列表(list)的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。

#把字符串编程Unicode码位的列表推导写法
>>> symbols = '$¢£¥€¤'
>>> codes = [ord(symbol) for symbol in symbols]
>>> codes
[36, 162, 163, 165, 8364, 164]
#用列表推导和map/filter组合来创建同样的表单
>>> symbols = '$¢£¥€¤'
>>> beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]
>>> beyond_ascii
[162, 163, 165, 8364, 164]
>>> beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols)))
>>> beyond_ascii
[162, 163, 165, 8364, 164]

(2)map()函数接受两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
filter()函数接收一个函数和一个序列。filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
(3)生成器表达式
虽然也可以用列表推导来初始化元组,数组或其他序列类型,但是生成器表达式是更好的选择,这是因为生成器表达式背后遵守了迭代器协议,可以逐个地产出元素,而不是先建立一个完整的列表,然后再把这个列表传递高某个构造函数里。
生成器表达式的语法跟列表推导差不多,只不过把方括号换成圆括号而已。

4. 元组

元组除了用作不可变的列表,它还可以用于没有字段名的记录
(1)如果在任何的表达式里,我们在元组内对元素排序,这些元素所携带的信息就会丢失,因为这些信息是跟它们的位置有关的。
(2)元组的拆包
在进行拆包的时候,我们不总是对元组里所有的数据都感兴趣,_占位符能帮助处理这种情况。

5. 序列的增量赋值

增量赋值运算符+=和=的表现取决于它们的第一个操作对象
+=背后的特殊方法是__iadd__。但是如果一个类没有实现这个方法的话,Python会退一步调用__add__。(
=同理)

考虑下面这个简单的表达式

>>>a += b

如果a实现了__iadd__方法,就会调用这个方法。同时对可变序列(例如list、bytearray和array.array)来说,a会就地改动,就像调用了a.extend(b)一样。但是如果a没有实现__iadd__的话,a += b这个表达式的效果就变得跟a = a + b一样了。也就是说,在这个表达式中,变量名会不会被关联到新的对象,完全取决于这个类型有没有实现__iadd__这个方法。

注意
(1)不要把可变对象放在元组里面;
(2)增量赋值不是一个原子操作;
(3)查看Python的字节码并不难,而且它对我们了解代码背后的运行机制很有帮助

6. 用bisect来管理已排序的序列

import bisect

bisect(haystack, needle)在haystack里搜索needle的位置,该位置满足的条件是,把needle插入这个位置之后,haystack还能保持升序状态。
bisect函数其实是bisect_right函数的别名,后者还有个姊妹函数叫bisect_left。它们的区别在于,bisect_left返回的插入位置是原序列中跟被插入元素相等的元素的位置,也就是新元素会被放置于它相等的元素的前面,而bisect_right返回的则是它相等的元素之后的位置。

7. 内存视图

示例:利用memoryview精准地修改了一个数组的某个字节

>>> numbers = array.array('h', [-2, -1, 0, 1, 2])
#'h'类型码,16位二进制正数
>>> memv = memoryview(numbers)#memv里的5个元素跟数组里的没有区别 
>>> len(memv)
5
>>> memv[0] 
-2
>>> memv_oct = memv.cast('B')#把memv里的内容转换成'B'类型,也就是8位的二进制
#因为16位二进制正数是采用8位二进制的小端放置,所以下面查看memv_oct是如下的内容
>>> memv_oct.tolist() 
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
>>> memv_oct[5] = 4 
#因为此时查看的是储存numbers地址上的二进制表示,所以修改这段二进制的表示会改变
#number内部的值
>>> numbers
array('h', [-2, -1, 1024, 1, 2])

NumPy和SciPy

NumPy和SciPy提供高阶数组和矩阵操作,十分的优秀,以后有机会可以学学。

列表或元组的方法和属性

那些由object类支持的方法没有列出来

列表元组
s.count(e)e在s中出现的次数
s.__delitem__(p)把位于p的元素删除
s.extend(it)把可迭代对象it追加给s
s.index(e)在s中找到元素e第一次出现的位置
s.insert(p, e)在位置p之前插入元素e
s.remove(e)删除s中的第一次出现的e
s.reverse()就地把s的元素倒序排列
s.__reversed__()返回s的倒序迭代器

小技巧

(1)

print('{:15} | {:^9} | {:^9}'.format('', 'lat.', 'long.'))
fmt = '{:15} | {:9.4f} | {:9.4f}'
print(fmt.format(name, latitude, longitude))

输出结果

                |  lat.    |  long.
Mexico City     |  19.4333 | -99.1333
New York-Newark |  40.8086 | -74.0204
Sao Paul        | -23.5478 | -46.6358

转载自https://blog.csdn.net/qq_43168521/article/details/102941826

https://www.jianshu.com/p/d7db4f0cd781

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论