python 3 中默认为使用utf-8编码方式,但是python 2则使用ASCII。
''' ''' 可以用来多行注释,也可以用来写多行字符串。
Input()函数:
在python 2.x中有raw_input() 和 input() 两种输入,在python 3.x中把raw_input() 和 input()整合成了一个函数,
就是input()函数。
python 3.x 中 ,input()接受任意的输入,默认为字符串处理,并返回字符串类型。
在 2.x的input()在输入时必须原样输入,如果想输入字符串asdfg,就必须输入“asdfg"。(方法鸡肋)
python的库分为标准库和第三方库。可以直接导入的库是标准库,而第三方库必须要下载安装才可以用。
标准库例如sys,os等。
记录两个os中的函数:
# 获取当前目录下的文件
cdm_res = os.system("dir") #执行命令不保存结果
cdm_res = os.popen("dir").read()#获取当前目录保存在cdm_res总中
print("--->",cdm_res)
# 在当前目录创建目录
os.mkdir("new_dir")
pyc是个什么东西?
编译型语言就是执行程序的时候把程序转换成机器语言,然后执行。比如c语言,.c -> .exe
解释型语言就是没有编译,直接运行,在运行的时候解释器对程序进行逐行的解释,运行。(类似于边执行边编译)
java是通过编译器变成“中间编码”,然后执行的时候在利用解释器进行逐行的翻译。(先编译后解释)
python与java是类似的,只是python不用手动编译,编译的过程对用户是透明的。PyCodeObject是程序编译后的结果,当python运行完是,解释器将PyCodeObject写回pyc,当第二次执行的时候直接运行pyc文件,不用再次编译的。pyc是预编译后生成的一个字节码文件。
数据类型:
整型:在python 2.x中会分为长整型和短整型,保存一个数字如果超过短整型时会自动存为long。
但是python3.x中并没有区分,都是int型。
浮点数:表示形式为小数。52.3E4 = 52.3 * 10 ** 4 。还可以表示复数,j表示虚数
布尔值:真或假 / Ture and False
bytes类型:在python3中文本和二进制有明显的区分。文本总是unicode,由str类型表示,二进制数据则是用bytes类型表示。
文件也可以用字节包来表示,那么字符串和字符包能够相互转换,str -> bytes 使用encode。bytes -> str 使用decode。
msg = '我爱天安门'
print(msg)
print(msg.encode())
print(msg.encode().decode())
结果:
我爱天安门
b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
我爱天安门
encode(),decode()在python3中默认为utf-8编码
在python3中数据的传输必须以二进制的形式传输,所以在socket传输数据的时候可能会用到二进制和字符串的转换。
三元运算 :
result = a1 if a1>b else a2
如果if后面的式为真,结果为a1 ,为假则结果为a2。
列表:name = [ ]
按位置取 name[n],取name中的第n个元素。列表的切片:name[a:b] 取name中的[a,b)左闭右开。
插入 name.insert() 或者 .append(),删除name.remove() 或者 del name[a] 或者 name.pop()。pop默认删除最后一个。
查询位置 name.index("aaa") ,返回aaa的下标。统计 name.count() 清空 .clear() 翻转 .reverse() 排序 .sort() 按照ASCII 。合并 .extend()
浅copy : 可以想象成只copy了第一层的数据。
import copy
person = [1,5,8,9,8,5,7,[881,400]]
# 浅copy的三种形式
p1 = person.copy()
p2 = person[:]
p3 = list(person)
person[0] = 500
person[7][0] = 5000
# p1[1][1] = 50
print(person)
print(p1,"\n",p2,'\n',p3)
结果:
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]
[1, 5, 8, 9, 8, 5, 7, [5000, 400]]
[1, 5, 8, 9, 8, 5, 7, [5000, 400]]
[1, 5, 8, 9, 8, 5, 7, [5000, 400]]
如果直接用“=”来复制的时候:完全相同
import copy
person = [1,5,8,9,8,5,7,[881,400]]
# 直接等号
p1 = person
person[0] = 500
person[7][0] = 5000
# p1[1][1] = 50
print(person)
print(p1)
结果:
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]
深copy : 完全独立的两个列表,占用两份的空间地址
import copy
person = [1,5,8,9,8,5,7,[881,400]]
# 深copy
p1 = copy.deepcopy(person)
person[0] = 500
person[7][0] = 5000
# p1[1][1] = 50
print(person)
print(p1)
结果:
[500, 5, 8, 9, 8, 5, 7, [5000, 400]]
[1, 5, 8, 9, 8, 5, 7, [881, 400]]
元组:和列表差不多,但是一旦创建就不可以更改,又叫做只读列表。name = ()
函数: name.isdigit() 判断变量是否为数值。enumerate(name) ,把列别的下标取出后与列表打包在一起
字符串处理相关函数:
name.capitalize() ----- 首字母大写
name.count("a") ----- 统计数量
name.center(50,"-") ------ 打印50个字符,不足位用”-“补足
name.endswith("ex") ---- 判断是否为”ex"结尾,返回Ture 或者 False
name.expandtabs(tabsize=30) --- 用30个空格代替tab
name.find("y") ----- 返回字母y所在的下标
name.format() --- 格式化输出
name.format_map() ----- 传入一个字典,和format作用一样。
name.isalnum() ---- 判断是否只有字符和数字
name.isalpha() ---- 判断是否只包含字符
name.isdigit() ---- 判断是否为整数
name.isidentifier() ---- 判断是否为合法标识符
name.isnumeric() ----- 判断是否只包含数字
name.isspace() ---- 判断是否为空格
name.istitle() ---- 判断是否每个首字母大写
name.isprintable() ----- 是否可以打印,例如tty file ,drive file不可打印
“+“.join(sequence) ----- 用”+“连接sequence中的每个元素
name.ljust(50,"-") ------ 不够50位在最后用“----”补足
name.rjust(50."*") ----- 不够50位在最前面用***补足
name.lower() ----- 变为小写
name.upper() ----- 变为大写
name.strip() ----- 去掉两边的空格和回车
name.lstrip() ---- 去掉左边的空格和回车
name.rstrip() ---- 去掉右边的空格和回车
p = str.maketrans("abcdef","12356") name.translate(p) ----- 把name中的'abcdef' 换成对用的 ’123456‘
name.replace("l","L",1) ---- 用第二个字符代替第一个字符,第三个数字代表替换的数量。
name.split() ----- 把字符串按照空格分隔变成列表。默认为空格,可以改成按照其他字符分割
name.splitlines() --- 按照换行符分隔
name.swapcase() --- 倒置字符串
name.title() ---- 变成一个title,首字母大写
name.zfill() ---- 不足位用0补足
字典:字典是无序的。且字典没有下标,是通过key值索引。所以key必须是唯一的。
# key - value
info = {
'stu1101':"zzhang",
'stu1102':"yyang",
'stu1103':"qqqang",
}
修改或增添的时候直接赋值:(如果key存在直接修改,如果key不存在则新增一个)
info['stu1101'] = "iiiuys"
info['stu1104'] = 'hahahaha'
print(info)
结果:
{'stu1101': 'iiiuys', 'stu1102': 'yyang', 'stu1103': 'qqqang', 'stu1104': 'hahahaha'}
删除:info.pop("key") 随机删除:info.popitem() 查找: info["key"] (要确定字典中有这一项) info.get() 可以查找,如果没有就返回None
判断是否存在:’key' in info 存在返回true,不存在返回false
info.value() --- 所有value的值
info.key() ---- 所有的key
info.setdefault() --- 如果存在返回其值,不存在则创建一个新的项。
info.update(b) --- 把两个字典合并,有交叉部分就更新,无交叉部分就创建。
info.fromkeys() --- 初始化一个字典,并赋一个初始化的值。(类似浅copy,一个修改全部修改,除非只有一层)
字典的循环:
info = {
'stu1101':"zzhang",
'stu1102':"yyang",
'stu1103':"qqqang",
}
for i in info:
print(i,info[i])
# for k,v in info.items():
# print(k,v)
结果:
stu1101 zzhang
stu1102 yyang
stu1103 qqqang
info.items() ---- 以列表返回可遍历的(键,值)元组数组。
k = info.items()
print(k)
结果:
dict_items([('stu1101', 'zzhang'), ('stu1102', 'yyang'), ('stu1103', 'qqqang')])
集合:去重合并,关系测试。集合也是无序的。
集合的创建:
list_1 = [1,2.4,5,4,8,6,1,7,8]
list_1 = set(list_1)
print(list_1,type(list_1))
结果:
{1, 2.4, 4, 5, 6, 7, 8} <class 'set'>
两个集合的交集:list_1 & list_2
list_1 = [1,2.4,5,4,8,6,1,7,8]
list_1 = set(list_1)
list_2 = set([1,8,54,69,4])
print(list_1.intersection(list_2))
结果:
{8, 1, 4}
并集:list_1 | list_2
print(list_1.union(list_2))
结果:
{1, 2, 4, 5, 6, 7, 8, 69, 54}
差集:list_1 - list_2
print(list_1.difference(list_2))
结果:
{2.4, 5, 6, 7}
子集关系判断:
print(list_1.issubset(list_2))#判断2是否是1的子集
print(list_2.issuperset(list_1))#判断1是否是2的父集
对称差集: list.symmetric_difference() ----- 去掉交集的并集 list_1 ^ list_2
list.isdisjoint() ---- 判断交集是否为空,空返回true 。
基本操作:集合中无法插入,只能添加。
添加:t.add() 添加多项:t.update([1,2,3,4,5]) 长度:len(a)
删除:t.remove() t.pop()【随机删除并返回】 t.discard() 删除指定的值并返回
x in a --- 测试x是否是a的成员 x not in a ---- 测试x是否不是a的成员