本文档整理自李宁老师发布在B站的视频,主要介绍python相关的基础入门知识,相关代码和本文档(md格式)提取码:pyth
12-18章
-
- 12 常用模块
- 13 文件和流
- 14 数据存储
- 15 TCP与UDP编程
- 16 网络高级技术
- 17 多线程
- 18 GUI库-tkinter模块
-
- 18.1 GUI库:tkinter
- 18.2 pack布局-水平居中
- 18.3 pack布局-水平填充
- 18.4 pack布局-设置水平外边框
- 18.5 pack布局-设置垂直外边框
- 18.6 pack布局-设置水平及垂直外边框
- 18.7 pack布局-设置内边距
- 18.8 pack布局-水平排列
- 18.9 place布局
- 18.10 grid布局
- 18.11 控件-Label和Button
- 18.12 Entry控件与Text控件
- 18.3 Radiobutton控件
- 18.14 Checkbutton控件
- 18.15 Scale控件(滑块控件)
- 18.16 Listbox控件(列表控件)
- 18.17 向窗口添加菜单
12 常用模块
12.1 常用模块:sys
import sys
# 将模块所在的路径添加到sys.path列表中
sys.path.append('./test')
print(sys.path)
import my
my.greet('Bill')
print(sys.modules['my'])
print(type(sys.modules['my']))
print(sys.platform)
# 命令行参数
# 使用cmd切换到当前文件的路径,输入:python demo12.1.py abc,'abc'就是传入的命令行参数
# 或者在Pycharm中调出下方的Terminal,输入python demo12.1.py abc
# 输出当前脚本文件的完整路径
print(sys.argv[0])
if len(sys.argv) == 2:
print(sys.argv[1])
my.greet(sys.argv[1])
print('------------------------')
# 标准的输入输出流
s = sys.stdin.read(6) # 只读取输入的前6个字符
print(s) # 输出读取的字符
sys.stdout.writelines('hello world')
sys.stderr.writelines('error') # 用红色标记错误输出,而且该行输出的位置是不确定的,可以多运行几次程序观察结果
# 当本脚本被调用时,会输出123,可以运行invoke.py查看运行结果
sys.exit(123)
# 下面是从pycharm控制台运行demo12.1.py的结果
PS D:\Projects\Python\test\demo12_Modules> python demo12.1.py abc
['D:\\Projects\\Python\\test\\demo12_Modules','test'] # 该列表还包含其他路径,这里不作展示,新添加的路径在列表的末尾,即'test'
hello Bill
<module 'my' from 'D:\\Projects\\Python\\test\\demo12_Modules\\./test\\my.py'>
<class 'module'>
win32
demo12.1.py
abc
hello abc
------------------------
请输入一段长度大于6的字符串: asigyhas
asigyh
hello worlderror
invoke.py文件中的代码
import subprocess
output = subprocess.getstatusoutput('python demo12.1.py Harry')
import pprint
pp = pprint.PrettyPrinter(indent=1)
pp.pprint(output)
# 先输出123,再输出demo12.1.py的调用结果
print(output[0])
12.2 获取和改变工作目录
import os
print(f"当前工作目录:{
os.getcwd()}")
# 获取当前工作目录中的文件名和目录名
print(os.listdir(os.getcwd()))
os.chdir('../')
print(f"改变后的工作目录:{
os.getcwd()}")
print(os.listdir(os.getcwd()))
当前工作目录:D:\Projects\Java\py2Md\target
['bill', 'classes', 'generated-sources', 'lib', 'maven-archiver', 'maven-status', 'Py2Md-1.0-SNAPSHOT.jar', 'Py2Md.exe', 'yourdir']
改变后的工作目录:D:\Projects\Java\py2Md
['.git', '.gitignore', '.idea', 'pom.xml', 'README.md', 'src', 'target']
12.3 文件与目录操作
'''
1、mkdir(dirname, permissions)
r w x
如果dirname存在,会抛出OSError
2、makedirs(dirname, permissions, exist_ok)
(1)创建多级目录 mkdir('a') mkdir('a/b')(如果上级目录a不存在,下级目录b也不会创建)
makedirs('a/b/c') 可以连续创建这三个目录
(2) exist_ok == False,如果目录存在,会抛出OSError
exist_ok == True,如果目录存在,不会进行任何操作
3、rmdir(dirname):删除目录
rmdir('a') 如果目录a不为空,会抛出OSError
4、removedirs(dirname):删除目录,可以指定多级目录
removedirs('a/b/c') 如果几层目录均为空,会全部删除
5、remove(filename)删除filename指定的文件
6、rename(src, dst) 将src参数指定的文件改名为dst指定的文件名
7、renames(src, dst)
a/b/c --> x/y/z 可以同时修改多层目录的名称
'''
# 建议跟着视频一步一步运行该文件
import os
if not os.path.exists('newdir1'):
os.mkdir('newdir1')
os.makedirs('x/y/z', 0o733, True)
try:
os.rmdir('newdir1')
except OSError as e:
print(e)
# os.removedirs('x/y/z')
if not os.path.exists('mydir'):
os.mkdir('mydir')
os.rename('mydir', 'yourdir')
if os.path.exists('x/y/z'):
os.renames('x/y/z', 'bill/mike/john')
if os.path.exists('newdir1/a.txt'):
os.remove('newdir1/a.txt')
12.4 软链接与硬链接
'''
软链接(符号链接):相当于Windows的快捷方式
硬链接:是文件的副本
'''
import os
# windows系统要实现软链接需要开启特权SeCreateSymbolicLinkPrivilege
# if os.path.exists('data.txt') and not os.path.exists('slink_data.txt'):
# # 建立软链接文件
# os.symlink('data.txt', 'slink_data.txt')
if os.path.exists('data.txt') and not os.path.exists('link_data.txt'):
# 建立硬链接文件
os.link('data.txt', 'link_data.txt')
12.5 用于获取和设置系统信息的函数和变量
'''
1、sep变量:返回当前OS的路径分隔符
2、pathsep变量:返回环境变量中的路径之间的分隔符
3、name变量:返回当前OS的名称
4、environ变量:以字典的形式返回系统中所有环境变量的值
5、getenv函数:获取指定的环境变量的值,通过参数可以指定环境变量名
6、putenv函数:设置指定环境变量的值,通过参数指定环境变量名和环境变量值
7、system函数:执行命令,通过参数指定要执行的命令
'''
import os
import subprocess
print('路径分隔符', os.sep)
print('环境变量路径之间的分隔符', os.pathsep)
print('操作系统名', os.name)
print(os.environ)
print('PATH=', os.environ['PATH'])
print('PATH=', os.getenv('PATH'))
路径分隔符 \
环境变量路径之间的分隔符 ;
12.6 集合
'''
集合满足:
1、无序性:集合中各个元素的值是平等的
2、互异性:集合中任意两个元素都是不同的,每个元素只能出现一次
3、确定性:集合中每个元素都是确定的,对于某个值来说,要么属于该集合,要么不属于该集合。
列表、字典都不能作为集合的元素值,因为它们都是可变的
'''
set1 = set(range(10))
print(set1)
set2 = set('helloabc') # 自动去除重复字符
print(set2)
set3 = set(['Bill', 'John', 'Mike', 'John'])
print(set3)
print('--------------------------')
# 求a和b的并集
a = set((1, 2, 3))
b = set([3, 5, 1, 6])
print(a.union(b))
print(a | b)
# 求a和b的交集
print(a.intersection(b))
print(a & b)
c = set([2, 3])
print(c.issubset(a))
print(a.issubset(c))
print(a.issuperset(c))
d = set([1, 2, 3])
print(a == d)
# 计算集合的差
print(a.difference(b))
print(a - b)
# 计算集合的对称差:只在其中一个集合出现的元素组成的集合
print(a.symmetric_difference(b))
print(a ^ b)
print((a - b) | (b - a))
x = a.copy()
y = a
print(y is a)
print(x is a)
print(1 in a)
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
{
'h', 'c', 'a', 'l', 'o', 'b', 'e'}
{
'Mike', 'John', 'Bill'}
--------------------------
{
1, 2, 3, 5, 6}
{
1, 2, 3, 5, 6}
{
1, 3}
{
1, 3}
True
False
True
True
{
2}
{
2}
{
2, 5, 6}
{
2, 5, 6}
{
2, 5, 6}
True
False
True
12.7 将集合作为集合的元素
'''
集合的元素和字典中的key都不允许是可变的对象,如集合、列表和字典
元组既可以做集合的元素,也可以做字典的key
'''
aSet = set([1, 2])
bSet = set([10, 20])
aSet.add(4)
print(aSet)
# a.add(b) # 直接将集合作为元素添加到另一个集合,会报错
aSet.add(frozenset(bSet)) # frozenset()只读取集合
print(aSet)
dict = {
'Bill': 30, 'Mike': 34}
# d[a] = 10 # 不能直接将集合作为key输入字典中
dict[frozenset(aSet)] = 10
print(dict)
# bSet.add(dict) # 集合不能添加可变对象,如字典
t = (1,2,3,4)
bSet.add(t)
print(bSet)
{
1, 2, 4}
{
1, 2, 4, frozenset({
10, 20})}
{
'Bill': 30, 'Mike': 34, frozenset({
1, 2, 4, frozenset({
10, 20})}): 10}
{
(1, 2, 3, 4), 10, 20}
12.8 堆Heap
from heapq import *
from random import *
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
heap = []
for n in data:
value = choice(data) # 从data中随机选取一个元素
# 将值添加到堆
heappush(heap, value)
print(heap)
heappush(heap, 30)
print(heap)
print(heappop(heap)) # 弹出最小值
data1 = [6,3,1,12,9]
heapify(data1)
print(data1)
print(heapreplace(data1, 123)) # 弹出最小值,并替换为123
print(data1)
print(nlargest(2, data1)) # 返回data1中的最大的n个值
print(nsmallest(3,data1))
print(list(merge([1,3,456,7],[0,1,-5,6],[1,7,4],[],[67])))
print(list(merge(['dog','horse'],['cat','fish','kangaroo'],key=len)))
[1, 2, 2, 4, 5, 5, 5, 9, 6]
[1, 2, 2, 4, 5, 5, 5, 9, 6, 30]
1
[1, 3, 6, 12, 9]
1
[3, 9, 6, 12, 123]
[123, 12]
[3, 6, 9]
[0, 1, 1, -5, 1, 3, 6, 7, 4, 67, 456, 7]
['dog', 'cat', 'fish', 'horse', 'kangaroo']
12.9 双端队列
from collections import deque
q = deque(range(10))
print(q)
# 在两端添加元素
q.append(123)
q.append(-32)
print(q)
q.appendleft(30)
print(q)
# 在两端弹出元素
print(q.pop())
print(q)
print(q.popleft())
print(q)
# 将q向左循环移动2个位置
q.rotate(-2)
print(q)
q.rotate(4)
print(q)
q1 = deque(['a','b'])
q.extend(q1)
print(q)
q.extendleft(q1)
print(q)
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 123, -32])
deque([30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 123, -32])
-32
deque([30, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 123])
30
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 123])
deque([2, 3, 4, 5, 6, 7, 8, 9, 123, 0, 1])
deque([9, 123, 0, 1, 2, 3, 4, 5, 6, 7, 8])
deque([9, 123, 0, 1, 2, 3, 4, 5, 6, 7, 8, 'a', 'b'])
deque(['b', 'a', 9, 123, 0, 1, 2, 3, 4, 5, 6, 7, 8, 'a', 'b'])
12.10 时间元组
import time
localtime = time.localtime(time.time())
print(f"当前时间是:{
localtime}")
print(type(localtime)) # localtime是一个对象
st = time.struct_time((1,2,3,4,5,6,7,8,9)) # 参数需要是含有9个元素的元组
print(st)
print(f"年 = {
localtime.tm_year}")
print(f"月 = {
localtime.tm_mon}")
print(f"日 = {
localtime.tm_mday}")
print(f"一年的第{
localtime[7]}天")
localtime = time.asctime(localtime)
print(localtime)
当前时间是:time.struct_time(tm_year=2021, tm_mon=11, tm_mday=10, tm_hour=21, tm_min=27, tm_sec=52, tm_wday=2, tm_yday=314, tm_isdst=0)
<class 'time.struct_time'>
time.struct_time(tm_year=1, tm_mon=2, tm_mday=3, tm_hour=4, tm_min=5, tm_sec=6, tm_wday=7, tm_yday=8, tm_isdst=9)
年 = 2021
月 = 11
日 = 10
一年的第314天
Wed Nov 10 21:27:52 2021
12.11 格式化日期和时间
'''
strftime: 参数1:格式化字符串 参数2:时间元祖
'''
import time
import locale
locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
print(time.strftime('%Y年%m月%d日 %H时%M分%S秒', time.localtime()))
# 输出星期的完整名称
print(time.strftime("今天是%A",time.localtime()))
2021-11-10 21:27:52
2021年11月10日 21时27分52秒
今天是星期三
12.12 时间戳的增量
import time
time1 = time.time()
time2 = time1 + 60
print(time2)
time3 = time1 + 60*60
time3 = time.localtime(time3)
print(time3)
print(time.strftime('%Y-%m-%d %H:%M:%S', time3))
1636550932.8739896
time.struct_time(tm_year=2021, tm_mon=11, tm_mday=10, tm_hour=22, tm_min=27, tm_sec=52, tm_wday=2, tm_yday=314, tm_isdst=0)
2021-11-10 22:27:52
12.13 计算日期和时间的差
import datetime
d1 = datetime.datetime(2017,4,12)
d2 = datetime.datetime(2018,12,25)
print((d2-d1).days)
d1 = datetime.datetime(2017,4,12,10,10,10)
d2 = datetime.datetime(2018,12,25,10,10,40)
print(d2-d1)
print((d2-d1).seconds)
d1 = datetime.datetime.now()
d2 = d1 + datetime.timedelta(hours = 10)
print(d2)
d2 = d1 + datetime.timedelta(hours = -10)
print(d2)
622
622 days, 0:00:30
30
2021-11-11 07:27:52.988998
2021-11-10 11:27:52.988998
12.14 获取某月和某年的日历
import calendar
import locale
cal = calendar.month(2021,1)
print(cal)
print(calendar.calendar(2021))
January 2021
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
2021
January February March
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 6 7
4 5 6 7 8 9 10 8 9 10 11 12 13 14 8 9 10 11 12 13 14
11 12 13 14 15 16 17 15 16 17 18 19 20 21 15 16 17 18 19 20 21
18 19 20 21 22 23 24 22 23 24 25 26 27 28 22 23 24 25 26 27 28
25 26 27 28 29 30 31 29 30 31
April May June
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 2 1 2 3 4 5 6
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30
31
July August September
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 4 1 1 2 3 4 5
5 6 7 8 9 10 11 2 3 4 5 6 7 8 6 7 8 9 10 11 12
12 13 14 15 16 17 18 9 10 11 12 13 14 15 13 14 15 16 17 18 19
19 20 21 22 23 24 25 16 17 18 19 20 21 22 20 21 22 23 24 25 26
26 27 28 29 30 31 23 24 25 26 27 28 29 27 28 29 30
30 31
October November December
Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su
1 2 3 1 2 3 4 5 6 7 1 2 3 4 5
4 5 6 7 8 9 10 8 9 10 11 12 13 14 6 7 8 9 10 11 12
11 12 13 14 15 16 17 15 16 17 18 19 20 21 13 14 15 16 17 18 19
18 19 20 21 22 23 24 22 23 24 25 26 27 28 20 21 22 23 24 25 26
25 26 27 28 29 30 31 29 30 27 28 29 30 31
12.15 随机数
'''
randint(m,n):用于产生m到n之间的随机整数,包括m和n
random():用于产生0到1之间的随机浮点数,包括0,但不包括1
uniform(m,n):用于产生m到n之间的随机浮点数,m和n可以是浮点数,包括m和n
randrange(m,n,step):在一个递增的序列中随机选择一个整数。其中step是步长
如randrange(1,6,2)会在列表[1,3,5]中随机选择一个整数
choice(seq):从seq序列中随机选择一个元素值。seq指定的列表元素可以是任意类型的值
sample(seq,k):从seq中随机选出k个元素,然后生成一个新的序列
shuffle(seq):把seq序列中的元素顺序打乱,该函数直接修改原有的序列
'''
import random
print(random.randint(1,100))
print(random.random())
print(random.randrange(1,20,3)) # 从[1,4,7,10,13,16,19]中选取
print(random.uniform(1,100.05))
intList = [1,2,5,7,39,40]
print(random.choice(intList))
newList = random.sample(intList, 3)
print(newList)
random.shuffle(intList)
print(intList)
58
0.44714554718797783
10
81.96900990017868
5
[40, 39, 2]
[40, 7, 39, 1, 2, 5]
12.16 数学函数
import math
print('圆周率 =',math.pi)
print('自然常数 =', math.e)
print(math.fabs(-1.2))
# 向上取整
print(math.ceil(1.3))
# 向下取整
print(math.floor(1.8))
print(math.pow(2, 10))
print(math.sqrt(8))
print(math.sin(math.pi/2))
print(math.cos(math.pi))
print(math.tan