python3学习笔记(1)

时间:2022-01-17 18:33:31
一、模块初识(接上篇)
模块(库)分为两种:
1、标准库:不需要安装直接可以导入的库,例:getpass。
2、第三方库:必须要下载安装才可以使用。

注:编辑的模块文件名不能与导入的模块名重复。
在模块文件中导入其他模块时,程序会先在本目录下查找模块,如果文件本身的名称和导入的模块名相同,则会找到并导入自身。
此操作在python2.x时会报错,在python3.x中可以正常运行。但不建议出现这样的情况。

标准库模块:
1、sys:
import sys
sys.path:python全局变量的路径,打印此方法会输出一组路径,所导入的模块,python都会从这些路径中查找。标准库一般存放在X:\\python_path\\base\\lib中,以后所安装的第三方库会放在X:\\python_path\\base\\lib\\site-packages目录中。
sys.argv:打印本模块的相对路径,并可进行传参。调取参数方法:print(sys.argv[n])

2、os:与系统交互的模块
import os
os.system:用于执行系统命令,但结果为直接输出,而不是返回结果。此方法返回的是命令直行的结果(0即成功,1即失败)
os.popen:将返回结果存储与内存中,并返回存储内存的地址,如需读出返回结果,还需追加使用.read()方法,例 os.popen("dir").read()
os.mkdir:在本模块所在的目录下创建一个目录。

二、python执行过程,PycodeObject和pyc
pyc:存放的是python进行预编译后的字节码,其并不是机器可识别的机器码。
python和java一样,虽然为解释型语言,但是其执行时隐含了一步预编译的过程。而在python中,PycodeObject和pyc即是编译的结果。
1、python程序在运行时,会先进行一次编译,编译的操作对于用户来说是透明的,其编译结果存放在内存中的pycodeobject中,然后由解释器进行解释执行。待程序运行完毕后,python会将pycodeobject中的内容保存成.pyc进行永久保存,在下一次运行同样的程序时,python解释器会先查找目录下有无相应的.pyc文件,如果有则直接翻译执行,如果没有则重复之前的操作方法。
2、为了防止代码更新后,解释器依然找到就代码运行后产生的pyc文件,解释器在找到相应的pyc文件后会将其日期与py文件的日期进行比对,如果py文件的日期新与pyc文件,则进行编译操作,如不是则直接翻译执行pyc文件。
3、在2.X版本中,编译结果写入pyc文件时,会在目录下直接创建以程序名命名的pyc文件。在3.X中会在目录下新建___pycache___目录存放pyc文件。

三、数据类型初识
1、数字
整数(int):在python2.X中还分长整形和整形。
浮点(float):浮点的表现形式是小数,但浮点不只包含小数。
布尔值:只有真和假两个值。真为1、假为0,或真为true、假为false。

四、数据运算
算数运算
1、加(+):两个对象相加
2、减(-):得到负数或是一个数减去另一个数
3、乘(*):两个数相乘或是返回一个被重复若干次的字符串
4、除(/):x除以y
5、取模(%):返回除法的余数
6、幂(**):返回x的y次幂
7、取整除(//):返回商的整数部分

比较运算
1、等于(==):对角对象是否相等
2、不等于(!=或者<>):比较两个对象是否不相等
3、大于(>):返回x是否大于y
4、小于(<):返回x是否小于y
5、大于等于(>=):返回x是否大于等于y
6、小于等于(<=):返回x是否小于等于y

赋值运算
1、简单的赋值运算符(=):c = a + b,将a+b的运算结果赋值给c
2、加法赋值运算(+=):c += a等同于c = c + a
3、减法赋值运算(-=):c -= a等同于c = c - a
4、乘法赋值运算(*=):c *= a等同于c = c * a
5、除法赋值运算(/=):c /= a等同于c = c / a
6、取模赋值运算(%=):c %= a等同于c = c % a
7、幂赋值运算(**=):c **= a等同于c = c ** a
8、取整除赋值运算(//=):c //= a等同于c = c // a

逻辑运算
1、and:a和b都为真则返回true,其余情况返回false。优先级大于or
2、or:a和b有一个为true则返回true。
3、not:x为true则返回false,x为false则返回ture

成员运算
1、in:在序列中找到值则返回ture
2、not in:在序列中没有找到值则返回ture

身份运算
1、is:判断两个标识符是不是引用自一个对象
2、is not:判断两个标识符是不是引用自不同对象

位运算
1、&:按位与运算,将两组二进制进行与运算。
2、|:按位或运算,将两组二进制进行或运算。
3、^:按位异或运算。
4、~:按位取反运算,将一组二进制的每一位进行取反,转换成十进制后减256得出最终结果。
5、<<:左移动运算符,每左移1位相当于乘2
6、>>:右移动运算符,每右移1位相当于除2

五、列表
只在python中叫列表,在其他语言中叫数组
列表语法:变量 = ["Minghu","Minglong",23,变量]
列表中可以存各种类型的数据,包括变量。
1、取列表中的一个元素
age = 9
name = ['Minghu','Minglong',22,age]
例1
取第一个元素即:
name[0]
之后的以此类推

2、取最后一个元素
age = 9
name = ['Minghu','Minglong',22,age]
例1
取最后一个元素即:
name[-1]
例2
取倒数第二个元素即:
name[-2]

3、一次性取多个元素(切片)
age = 9
name = ['Minghu','Minglong',22,age]
例1
取'Minghu','Minglong'即:
name[0:2]
第一个参数代表起始元素的下标,第二个参数代表其前一个元素
例2
取倒数两个元素即:
name[-2:]
注,第二个参数不写即默认包含最后一个元素
例3
取前2个元素即:
name[:2]
注,第二个参数不写即默认包含第一个元素

4、总取值结果中再次取值
例1
取Minghu中的i:
name[:3][0][1]

5、修改列表中的元素值
例1
name[1] = "Wangminglong"

6、将某个元素插入列表
例1
name.insert(2,"Minggou")
注,一次只能插入一个元素

7、追加一个值到列表最后
例1
name.append("alex")

8、从列表中删除一个元素
例1
name.remove("Minggou")
注,一次只能删除一个元素

9、从列表中多个元素
del是python中的全局功能,代表删除一个内存中的数据,可以杉树任何东西。
例1
del name[2:5]

10、修改列表中的一个元素
例1
name[2] = 33

11、设置取元素的步长
例1
print(name[0:-1:2])
注,最后一个参数为步长,默认为1
也可写成
print(name[1::2])
print (name[::2])

12、查找某个元素在不在列表中
例1
print(22 in name)
其返回的是一个布尔值

13、查询一个元素在里列表中有几个
例1
num_of_ele = name.count(22)
print (num_of_ele)
注,不支持模糊查找

14、查找某个元素在列表中的下标
例2
position_of_ele = name.index(22)
print(position_of_ele)

15、扩展一个列表到当前列表中
例1
name.extend(name2)
会将列表name2的元素追加到name列表中,name2列表依然存在。

16、反转列表中元素的顺序
例1
name.reverse()

17、将元素无序的列表进行排序
例1
name.sort()
按照ACSII码的顺序进行排序,一般数字在前。
注,如果列表中有字符串和数字,在3.X中无法进行排序

18、按元素的下标进行删除元素
name.pop()
注,没有指定下标的时候默认删除最后一个

19、复制整个列表到另一个变量
例1
name2 = name.copy()
copy后,如原列表被修改,name2不会受影响。
注,但是如果列表中有子列表,当子列表被改变以后,name和name2都受影响。
例2
如果想完全copy一个列表,包含其子列表,需要用到copy库,如下
import copy
name3 = copy.deepcopy(name)
注,如果直接将name赋值给name2,那么当name中的非列表元素被修改,两个列表都受影响。

20、查看列表的长度
即查看列表中有多少个元素
print(len(name))
注,len可以查看任何东西的长度

六、元组
元组和列表作用是一样的,但是元组一旦生成就不能被修改(即只读列表)。
语法:r = (1,2,3,4)
数据类型为:tuple

七、字符串的常用操作
1、移除指定字符
username = "al ex"
if username.strip() == "alex":
print("welcome")
注,.strip默认剥离字符串中的空格和换行

2、分割字符串
names = "alex,jack,rain"
name2 = names.split(",")
print(name2)

3、合并列表元素成字符串
names = ["alex","jack","rain"]
print("|".join(names))

4、补齐字符串
如果规定字符串长度为40,但实际只有7,打印时可以用center方法进行填充
例1
name = "alex li"
print (name.center(40,"-"))

5、查找字符串中是否有某个字符
例1
name = "alex li"
print (name.find(“a”))
注,如果找到则返回1,如果没找到则返回-1

6、判断字符串是否为数字
例1
age = input("your age:")
if age.isdigit():
age = int(age)
else:
print("invalid data type")

7、判断字符串是否以某个字符开始/结束
name.startswith("aaa")
name.stratswith("aaa")
返回ture或者false

8、将字符串以大写/小写形式打印
print(name.upper())
print(name.lower())

八、字典
针对有大量数据的列表不方便操作而产生,但字典默认是无序的。
字典是一个key:value的结构,key值是唯一的,当重复时只选择一个key,具有天然去重的功能。
1、语法:
id_db = {
37148199306143632:{
"name":"Alex Li",
"age":22,
"addr":"shandong"
},
22048199306143632:{
"name":"Shanpao",
"age":24,
"addr":"dong"
},
22148199306143632:{
"name":"qujiang",
"age":25,
"addr":"dongbei"
},
}
print(id_db)
key和value用冒号分割,每个字典元素用逗号分割。

2、取值

print(id_db[22148199306143632])

3、改值、增加值

id_db[22148199306143632]["name"] = "wangminghu"
注,如果key没有,则直接进行添加

4、删除值

del id_db[22148199306143632]["name"]
id_db[22148199306143632].pop("name")

5、copy、clear
和列表中的copy、clear用法一样

6、取值(get)

v = id_db.get(22148199306143632)
效果和直接取值一样,区别在于,使用get时,如果key不存在则返回None,而直接取值时key值不存在程序则会报错。

7、增量更新
用另一个字典更新本字典,其中如果有key重复的,则用新字典的key值覆盖原key值内容,如果没有重复的,则将新字典的值加入本字典

id_db = {
37148199306143632:{
"name":"Alex Li",
"age":22,
"addr":"shandong"
},
22048199306143632:{
"name":"Shanpao",
"age":24,
"addr":"dong"
},
22148199306143632:{
"name":"qujiang",
"age":25,
"addr":"dongbei"
},
}

dic2 = {
"name":"wangwang",
22148199306143632:{
"name":"qujiang",
"age":26,
"addr":"dongbei"
},

id_db.update(dic2)
print(id_bd)

8、将字典转换成列表

print(id_db.items())
注,在数据量巨大的时候不要用,很耗时间,一般不用。

9、打印字典所有values
print(id_db.values())

10、打印字典所有key
print(id_db.keys())

11、判断字典里是否用某个key值

22148199306143632 in id_db

12、setdefault
查找字典,如果里面有所查找的key,则打印key的元素,如果没有则增加这个key并给其一个默认元素,默认的元素为None,可修改

print(id_db.setdefault(12345,"hahaha"))

13、fromkeys
把列表中的每个元素作为key放到字典里,并且为每个key一个值

print(id_db.fromkeys([1,2,3,4],"ss"))