Python 学习笔记
- Python中如何做到Print() 不换行
答:Print("输出内容",end=‘不换行的分隔内容‘),其中end=后面为2个单引号
注:在Python 2.x中,Print "输出内容", 即在输出内容后加一逗号
- Python中 is 和 == 的区别
答:Python中的对象包含三要素:id、type、value
其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值
is判断的是a对象是否就是b对象,是通过id来判断
==判断的是a对象的值是否和b对象的值相等,是通过value来判断
- Print()函数使用方法
答:1). 单引号与双引号的使用:若字符串内容中只包含单引号不包含双引号则用双引号包围,若字符串中只包含双引号不包含单引号则用单引号包围。
2). 转义字符\n用于在print()函数中进行换行
3). 在print()函数中,字符‘\‘用于表示下一行在逻辑上是本行的连续内容
4). r"字符串"中,r用于表示生成"原始"字符串
- 乘号"*"与加号"+"的多态性
答:乘号在数学计算中表示乘法运算,在字符串运算中表示对该字符串多次重复;加号在数学计算中表示加法运算,在字符串运算中表示对多个字符串的连接
- Python strip()函数介绍
答:s.strip(rm):其中,s为字符串,rm为所要删除的字符序列。有以下几种变体
1). s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
2). s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符
3). s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符
4). 当rm为空时,默认删除边上的空白符(包括‘\n‘, ‘\r‘, ‘\t‘, ‘ ‘)
5). rm序列中的元素不分先后次序,
- 字符串
答:1). 字符串索引,也称索引切片,用中括号[]表示,[第一个索引值:第二个索引值],结果包括第一个索引值,但不包括第二个索引值。索引默认值第一个为0,第二个为字符串长度,及忽略第一个则从首字符开始索引,忽略第二个则索引到最后一个字符。索引值可以为负数,此时将从右边开始计算,若索引值为正数则表示从左边开始计算。
2). Python字符串不可变,向字符串索引赋值会发生错误
3). 切片操作不变性:s[:i]+s[i:]=s
- Python中单引号、双引号、三引号有什么区别?
答:1). 双引号所表示的字符串通常要写成一行,若要写成多行要使用\(连行符)
2). 三引号不需要使用行转义符"\n"
- 列表,元素为数字时不需引号,元素为字符串时需要引号
答:1). 替换:a[0:3]=[1,2,3]
2). 删除:a[0:4]=[]
3). 清空:a[:]=[]
4). 插入:a[2:2]=[1,2,3,4,5]
5). 嵌套:b=[3,5,7]
a=[1,b,9],即a=[1,[3,5,7],9]
此时len(a)=3,a[1][2]=7
- 多重赋值
答:一个表达式内可以同时对多个变量进行赋值
- True & False
答:Python中,任何非零整数都是True,0是False;对任意序列,长度不为0的相当于True,空序列相当于False。(注:仅仅在使用时相当于)
- for 语句
答:for语句依据序列中的子项顺序进行迭代,句式为:for x in a:(注意,句末有冒号)
- range()函数
内置函数,可用于生成一个等差级数链表。range(Start, end, step),其中step可缺省,缺省时默认为1
- break & continue 语句
用于跳出最近以及for 或 while循环(同C/C++中的一样)
- pass 语句
pass 语句什么也不做,用于那些在语法上必须要有语句,然而程序什么都不做的场景
这通常用于创建最小结构的类:
或在创建新代码时用来当做函数或控制体的占位符
- 用关键字def 定义函数
- 关键字def后面必须跟有函数名、带有形参的圆括号(),函数体从下一行开始,且必须是缩进的
- Python中函数参数传递的几种方法
- 函数的4种定义形式
f(arg1,arg2,…..)、f(arg1=<value1>,arg2=<value2>,…)、f(*arg1,*arg2,…)、f(**arg1,**arg2,…);这4种方式可以组合使用,但要注意遵循以下规则:arg=<value>必须在arg之后、*arg必须在arg=<value>之后、**arg必须在*arg之后,即argàarg=<value>à*argà**arg
- 对f(arg1,arg2,…)形式
在进行调用时所给的实参必须与形参个数相同,且赋值是所对应的先后位置也必须完全符合;
- 对f(arg1=<value1>,arg2=<value2>,…)形式
因为在函数定义时已经有给形参赋予默认值,故在调用时可以不再赋新值,若未赋新值则按定义时给的默认值。默认值只会被赋值一次,但是当默认值为列表、字典或其他可变对象时默认值在调用过程中会积累。如下例:
结果:
若不想让默认值在后续调用中累积,可用以下方式
结果
- 关键字参数
利用关键字参数调用时必须先写参数位置再写参数值,且参数位置必须来源于形参名字;每个参数均不可进行多次赋值。
- 可变参数列表
待补充
- Lambda形式
待补充
- 文档字符串
文档字符串第一行应以大写字母开头,以句号结尾;第二行空白;第三行应有一行或多行用于描述对象的调用约定、边界效应等。
- 对f(arg1,arg2,…)形式
- 函数的4种定义形式
- append()函数 VS +
- 加号+只能连接列表跟列表(此句存疑)
- append()函数在原表里修改,而+创建一个新表
结果:
- Python编码风格
- 使用4个空格缩进,而不是用Tab
- 折行,以保证其不会超过79个字符,这有助于小显示器用户阅读以及让大显示器用户能并排显示几个代码文件
- 用空行分隔函数和类,以及函数中的大块代码
- 注释尽量独占一行
- 使用文档字符串
- 把空格放到操作符两边、逗号后面,但是括号里侧不加空格。如a = f(1, 2) + g(3, 4)
- 统一函数和类命名,推荐使用驼峰命名,函数和方法用小写_和_下划线。总是用self作为方法的第一个参数
- 不使用花哨的编码。Python默认UTF-8,或者用ASCⅡ
- 不要用非ASCⅡ的标识符。
- 列表对象方法
- List.append(x): 将一个元素添加到链表的末尾,相当于a[len(a):] = [x]
- List.extend(x): 将一个给定列表中的所有元素都添加到另一个列表中,相当于a[len(a):] = L
- List.insert(i, x): 在指定位置插入一个元素,第一个参数为所要准备插入到其前面的元素的索引
- List.remove(x): 删除链表中值为x的第一个元素,若没有这样的元素则返回错误
- List.pop([i]): 从链表中的指定位置删除元素,并将其返回。若没有指定索引则返回最后一个元素。元素随即从链表中被删除。
- 注:如上方括号[]表示这个参数是可选的,而不是要求要输入一个方括号,在Python库的参考手册中经常会遇到这样的标记
- List.index(x): 返回链表中第一个值为x的元素的索引,若没有匹配的元素则返回一个错误
- List.count(x): 返回x在链表中出现的次数
- List.sort(): 对链表中的元素就地进行排序
- List.reverse(): 就地倒排链表中的元素
如上,append(), extend(), insert(), remove(), sort(), reverse()均没有返回他们的值而是返回None,在Python中对所有可变的数据类型这是统一的设计原则。对比以下程序:
- 把链表当堆栈使用
堆栈:后进先出。用append()方法可以将一个数据添加到堆栈顶,用不指定索引(即不给定[i])的pop()可将一个元素从堆栈顶释放出来
- 把链表当队列使用
队列:先进先出。不过列表这样用效率太低,相对来说,数据从列表的末尾添加和弹出很快,但是从其头插入和弹出则很慢(为了一个元素需要移动整个列表的所有元素)
若要实现队列,可以用collections.deque(即collections库中的deque模块),它为在首尾两端快速插入和删除而设计
- 列表推导式
列表推导式即:从序列中创建列表。如:
当列表有2个元素时:
结果:
以下结果原因待分析
- del语句
从列表中按给定的索引删除值(语pop()的按值删除不同)。del语句还可以从列表中删除切片或清空整个列表。在变量被删除后若再引用该变量则会引发错误(直到另一个值赋给它为止)
- 元组和序列
元组是由无数个逗号分隔的值组成的,在元组的输入时可以有或没有括号"()",但一般来说括号是必须的。元组在输出时都是有括号的。
不能给元组的一个独立的元素赋值(即元组的各元素是不可变的),但是可以通过联接和切割来模拟。同时元组还可以创建包含可变对象的元组,例如链表。
结果
- 集合
集合是一个无序不重复元素的集。基本功能包含关系测试和消除重复元素。
大括号{}或set()函数可以用来创建集合。注意,若要创建空集合必须使用set()而不是{},后者用于创建空字典。
- 字典
- 字典以关键字为索引(序列以连续的整数作为索引),关键字可以是任意不可变类型,通常为字符串或数值;字典中的对象不可当作关键字,因为链表可以用索引、切割或其他方式改变
- 字典可以看作无序的"键:值对(key:value)"集合,在同一字典内,键必须是互不相同的。一对大括号"{}"创建一个空的字典。
- 字典的操作主要依据键来存储和析取值;也可以用del来删除建:值对;如果用一个已经存在的关键字存储值则该关键字原来的值会被覆盖;试图从一个不存在的键中取值会导致错误。
- 可以用in 关键字检查字典中是否存在某个关键字
- dict()构造函数可以直接从key-value对中创建字典;字典推导式可以从任意的键值表达式中创建字典
结果
- 循环技巧
- 在字典循环中,关键字和其所对应的值可以使用iteritems()方法同时解读出来
- 在序列循环中,索引位置和对应的值可以使用enumerate()函数同时得到
- 同时循环2个或多个序列时可以使用zip()整体打包
- 若要逆向循环,先正向定位序列,然后调用reversed()函数
结果
- 深入条件控制
- 比较操作符in 和 not in 用于审核一个值是否在给定的区间内;操作符is 和not is比较两个对象是否相同。
- 逻辑操作符and 和or 也称短路操作符,他们的参数从左向右解析,一旦结果可以确定就停止。如若A、C为真,B为假,则A and B and C将不会解析C,因为A and B已经可以判断出结果为假
- Python中,表达式内部不能进行赋值
- 比较序列和其他序列
没看懂,待补充
- 模块
- 模块即Python中提供的一种可以从文件中获取定义,在脚本或解释器的一个交互实例中进行使用的文件;模块中的定义可以导入到另一个模块或主模块中。模块是包含Python定义和声明的文件。
- 每个模块在每个解释器会话中只会导入一遍,因此,如果修改了模块需要重启解释器,或者用reload()重新加载模块。
- 将模块作为脚本来执行
在模块后加入如下代码:
if __name__ == "__main__":
import sys
fib(int(sys.argv[1]))
- 模块的搜索路径
- 当前目录à环境变量PYTHONPATH表示的目录列表àPython默认安装路径
- 自定义模块不要跟标准模块重名
- dir()函数
内置函数dir()用于按模块名搜索模块定义,他返回一个字符串类型的存储列表
- 包
- 包通常是使用"圆点模块名"的结构化模块命名空间。例如,A.B 的模块表示了名为A的包中名为B 的子模块。
- 包的引用方式:
- import sound.effects.echo, 此种方式之后再使用时必须通过完整的名称来引用,如sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
- from sound.effects import echo, 此种方式可以在没有包前缀的情况下使用,如echo.echofilter(input, output, delay=0.7, atten=4)
- from sound.effects.echo import echofilter, 此种方式可以直接调用它的echofilter()函数,如echofilter(input, output, delay=0.7, atten=4)
- 从*中导入包
- 执行from package import *语句时,如果包中的__init__.py代码定义了一个名为__all__的列表,就会按照列表中给出的模块名进行导入。如:若sound/effects/__init__.py这个文件可能包含如下代码:__all__ = ["echo", "surround", "reverse"], 这意味着from sound.effects import *语句会从sound包中导入以上三个已命名的子模块
- 尽量不使用from package import *的方式导入
- 命名空间
命名空间是从命名到对象的映射。当前命名空间主要通过Python字典来实现。
Python中任何一个"."之后的命名为属性,从模块中引用命名是引用属性。
- 作用域
作用域就是一个Python程序可以直接访问命名空间的正文区域,在这里,直接访问的意思是一个对名称的错误引用会尝试在命名空间内查找
- 类
类定义形式:
- class classname:
<statement-1>
.
.
.
<statement-N>
习惯上,类定义语句的内容通常是函数定义,不过其他语句也可以。
- 类对象支持2种操作:属性引用和实例化:
- 很多类都倾向于将对象创建为有初始化状态的,因此类可能会定义一个名为__init__()的特殊方法,如下
def __init__(self):
self.data = []
类定义了方法__init__()的话,类的实例化操作会自动为新创建的类实例调用__init__()方法。
- Python命名约定
- 避免使用字符o、O、I作为单字符变量名,因其难以与0、1分辨
- 模块名使用不含下划线、简短的、全小写名字
- 类名使用首字母大写单词串(驼峰命名法)
- 异常名通常用"Error"
- 全局变量:在那些不想被导入的全局变量前加一个下划线
- 函数名应该为小写,可用下划线风格单词以增加可读性
- 方法名和实例变量:与函数相同,使用小写,必要时用下划线增加可读性
- 继承的设计:私有属性在前面加2个前导下划线,无后置下划线;非公有属性有一个前导下划线,无后置下划线
- 格式化输出
- 将任意值转换为字符串:repr()函数、str()函数:str()用于将值转化为适合人阅读的形式;而repr()将值转换为供解释器读取的形式。
- str.rjust():右对齐;str.ljust():左对齐;str.center():居中对齐;str.zfill():向数值的字符串表达左侧填充0.
- str.format():
大括号和其中的字符会被替换成传入str.format()的参数。大括号中的数值用于指明使用传入str.format()方法的对象中的哪一个(数值从0开始)。
str.format()调用时可以使用关键字参数也可以使用参数名来引用值
‘!a‘(应用ASCII), ‘!s‘(应用str()), ‘!r‘(应用repr())可以在格式化前转换值
字段名后允许可选的‘:‘ 和格式指令。这允许对值的格式化加以更深入的控制。
在字段后的‘:‘ 后面加一个整数会限定该字段的最小宽度,这在美化表格时很有用
若有的字符串很长,我们并不想像上面的例子那样把2个元素分割那么开,则可以传入整个字典,用中括号来访问它的键
显然,此种方法并不好用,因为每个键:值对均需由我们来输入键才可以得到值
- 旧式的字符串格式化
操作符% 也可以用于字符串格式化。因为str.format()还很新,大量Python代码中还在使用%操作符,但因为就是操作符终将被舍弃,应该尽量使用str.format()
- 文件读写
函数open()返回对象文件,通常的用法为:open(filename, mode): 可选mode 有
‘r‘—只读(默认)、‘w‘—只写,不可读(若有同名文件则将其覆盖)、‘a‘—追加(若文件不存在则新建,若存在则在其末尾加入)、‘r+‘—以读写方式打开;‘b‘—以二进制方式打开文件,在操作jpeg或exe这种二进制文件时必须用二进制模式打开。
- 文件对象方法
- f.read(size),该方法读取若干数量的数据并以字符串形式返回其内容,其中size是可选参数,指定字符串长度,若未指定或给定的为负数则返回整个文件。
- f.readline()从文件中读取单独一行,若为空行则返回‘\n‘
- f.write(sting)方法将string的内容写入文件,并返回写入字符的长度,若要写入其他非字符串内容,要先将其转换为字符串
- f.tell()返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文件开头到指针出的比特数
- 若要改变文件对象指针则使用f.seek(offset, from_what),from_what值为0表示自文件起始处开始,为1表示子当前文件指针位置开始,为2表示自文件末尾开始。from_what可以忽略,默认为0。对于那些没有以‘b‘模式打开的文件,只允许从文件头开始计算相对位置(使用seek(0, 2),从文件尾计算时将会引发异常)
- 当文件使用完后,需要调用f.close()将其关闭并释放其占用的所有系统资源。(文件打开后必须关闭,否则改变后的文件将在系统缓存中并没有写入文件)
- 用关键字with处理文件对象是个好习惯,他的先进之处就在于文件使用完后会自动关闭,就算发生异常也没关系。
- pickle模块
pickle.dump()
Pickle.load()
待补充
- 异常处理
- try语句:try语句按如下方式工作:
- 首先,执行try子句(在try和except关键字之间的部分)
- 若没有异常发生,则except子句在try语句执行完毕后即被忽略
- 如果try自居执行过程中发生了异常,则该子句其余部分就被忽略。如果异常匹配于except关键字后面指定的异常类型,则执行对应的except自居,然后继续执行try后的代码
- 如果发生了异常而在except子句中没有与之匹配的分支,则传递到上一级try语句中,若最终仍找不到对应的处理语句则成为一个未处理异常,终止程序运行,显示提示信息
- 一个except子句可以在括号中列出多个异常。try…except语句可以带有一个else子句,该子句只能出现在所有except之句之后,当try语句没有抛出异常时,需要执行一些代码,可以使用这个子句
- 抛出异常
raise语句允许程序员强制抛出一个指定的异常。
- 用于自定义异常
在程序中用户可以通过创建新的异常类型来命名自己的异常,异常类通常应该直接或间接地从Exception类派生
- 定义清理行为
- finally子句在程序离开try后被执行,且不论是否发生异常均会被执行。
- 在真实场景的应用程序中,finally子句用于释放外部资源(文件或网络连接之类的),无论他们的使用过程中是否出错
- 预定义清理行为
- urllib2标准库学习
- 最基本的爬站:打开一个网页,并读取出来,代码如下:(需要urllib2库)
- 使用代理服务器(如图中注释部分)(需要urllib2库)
- 使用cookie(需要urllib2库以及cookielib库)
- 若要同时使用代理服务器以及cookie则将opener更改为
- 使用表单
- 伪装成浏览器:
- 利用urllib.urlretrieve下载图片是显示下载百分比: