from __future__ import print_function # 导入 __future__ 包
多行连接符 \
Python有五个标准的数据类型:
Numbers(数字)
String(字符串) (‘’)
List(列表) 用[]创建,增加元素用append()参数作为一个元素增加到列表的末尾,extend()参数作为一个列表去扩展列表,insert(x,y)在x位置插入元素y
Tuple(元组) 用(,)创建
Dictionary(字典) 用dict()或者{}创建;读取X.items() X.values() X.keys() 或者 X.get(x,‘未找到返回此值’),或者 x in X
Python列表截取
list[1:3] # 输出第二个至第三个元素
Python成员运算符 in , not in
Python身份运算符 x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True
is 用于判断两个变量引用对象是否为同一个(同一块内存空间), == 用于判断引用变量的值是否相等。
is is not 身份运算符
in not in 成员运算符
not and or 逻辑运算符
if 判断条件1:
执行语句1……
elif 判断条件2:
执行语句2……
elif 判断条件3:
执行语句3……
else:
执行语句4……
for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
for循环的语法格式如下:
for iterating_var in sequence:
statements(s)
函数 len() 返回列表的长度,即元素的个数。 range返回一个序列的数。
fruits = ['banana', 'apple', 'mango']
print(range(len(fruits))) 输出range(0, 3)
元组与列表类似,不同之处在于元组的元素不能修改,能连接组合,只能del语句来删除整个元组。
元组使用小括号,列表使用方括号。元组中只包含一个元素时,需要在元素后面添加逗号
字典创建时如果同一个键被赋值两次,后一个值会被记住
变量没有类型
lambda 来创建匿名函数。lambda [arg1 [,arg2,.....argn]]:expression
__private_method:两个下划线开头,声明该方法为私有方法
xx.index()查下标
set([]) 集合 ,set得到的是无序的,弃掉重复的
frozenset([]) 不可变集合,不可增删改
py3源码文件默认使用utf-8编码,支持中文变量命名
try:检测范围 except .... as reason:.... 使用try异常处理时,异常位置之后的程序不再执行
try:检测范围 except .... as reason:.... finally:... 最后这之后的代码会被执行
raise 异常名('想异常反馈给用户的信息') 如 raise ZeroDivisionError('被除数为0')
with open(...) as file:.... 该语句关注打开的文件错误与否,以及自动关闭文件
子类修改__init__函数时,若想要父类的原来__init__功能,只需在子类添加代码 super().__init__()或者是 父类名字.__init__()
多重继承 class Child(Base1,Base2...)
如果属性名和方法名相同,属性会覆盖方法,即再调用方法时会失败
py严格要求方法需要有实例才能被调用,这种限制叫绑定
参数前面加上* 号 ,意味着参数的个数不止一个
带一个星号(*)参数的函数传入的参数存储为一个元组(tuple)→(2,3,4)
带两个(*)号则是表示字典(dict)→{a:2, b:3}
python魔法方法__setattr__()在属性赋值时被调用,并且将值存储到实例字典中,这个字典应该是self的__dict__属性。即:在类实例的每个属性进行赋值时,都会首先调用__setattr__()方法,并在__setattr__()方法中将属性名和属性值添加到类实例的__dict__属性中。重写__setattr__()函数时要注意防止无限递归的情况出现,一般解决办法有两种,一是用通过super()调用__setatrr__()函数,二是利用字典操作对相应键直接赋值。
描述符类涉及get delete set 三个方法(之一)
xx = Xyyy(),当xx被赋值时,该xx属性的描述符类方法Xyyy()中的__set__方法会被执行
迭代器iter(),配合next()实现for循环功能。 魔法方法__iter__() ,__next__()
生成器 具有可暂停,重新开始等特点
e = (i for i in range(10))
next(e)
==================
sum(i for i in range(100) if i %2)
py中增加搜索模块()路径 :
import sys
sys.path.append('.....')
包:
创建一个文件夹,存放模块,文件夹的名字就是包的名字
在文件夹中创建__init__.py的模块文件,可以为空
代理
1.参数是一个字典{'类型','代理ip:端口号'}
proxy_support = urllib.request.ProxyHeader({})
2.定制,创建一个opener
opener = urllib.request.build_opener(proxy_support)
3.安装opener
urllib.request.install_opener(opener)
4.调用opener
opener.open(url)
正则:
注意正则匹配的是字符,不能随意加空格
.匹配换行符之外的任何字符
\转义一些有特殊意义的字符如.或者赋予新意义
\w 匹配字母或数字或下划线或汉字 等价于 '[^A-Za-z0-9_]'
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
用[]创建一个字符类,只要匹配[]中任何一个就算成功,区分大小写。用-可表示范围如0-9
ab(3)c表示abbbc
ab(3,10)c表示ab....c其中b3-10个
[0-255]表示匹配0 ,1 ,2 , 5 ,5
|表示或
()括起来的表示一个小组
(..)(..)(..)..\1 表示第一组重复一次
\数字数字数字,表示某字符ascii转为8进制
{0,1}表示前面的单个字符重复0或1次,前面可用()表示一组
IP地址规则 (?:(?:[01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}(?:[01]{0,1}\d{0,1}\d{0,1}|2[0-4]\d|25[0-5])
[\n]匹配回车
[^a-z]除了a-z都匹配
*等价于{0,}即0或多次
+等价于{1,}即1或多次
?等价于{1,0}即0或1次
p = re.compile(r'规则')与p.findall('待匹配字符串')一起使用,前者编译正则规则,后者返回一个结果列表。
re.search(r'....','....') 返回的结果类型匹配对象,不是字符串
result.group()用来提出分组截获的字符串
p.findall(),总结
第一,p中不带有括号,其输出的内容就是整个表达式所匹配到的内容。
第二,p 中带有1个括号,其输出的内容就是括号匹配到的内容,而不是整个表达式所匹配到的结果。
第三,p 中是带有2个括号的,我们可以看到其输出是一个list 中包含2个 tuple
s = sys.stdin.readline().strip().split()
strip用于去除字符串首尾的字符,默认是空格、\n、\t
注意只能去除首尾的
sys.stdin.readline( )会将标准输入全部获取,包括末尾的'\n',input()会把‘\n'忽略