基于网络课程《Python全栈开发专题》 记录笔记,请支持正版课程。
sys模块
import sys
# 类似于java classpath
print(sys.path)
# 引入这个模块
sys.path.append(r'./test')
import my
my.greet('二狗')
# 引入my.py模块的另一种方法
# import imp
# my = imp.load_source('my', r'./test/my.py')
# my.greet('二狗')
print(sys.modules['my']) # <module 'my' from './test\\my.py'>
print(type(sys.modules['my'])) # <class 'module'>
# 打印操作系统标识
print(sys.platform)
# 获取运行参数,其中第1个参数是脚本本身
print(sys.argv[0]) # .... src\chapter12\demo01.py
# 标准输入输出流
s = sys.stdin.read(6) # 只读取前6个字符
print(s)
sys.stdout.writelines('Hello Ketty')
sys.stderr.writelines('[Error] Something was happened.');
获取和改变工作目录
import os
# 获取和改变工作目录
print('当前工作目录:', os.getcwd())
# 目录下的所有文件和子目录
for dir in os.listdir(os.getcwd()):
print(dir)
# 跳转
os.chdir('../')
print('改变后的工作目录:', os.getcwd())
print(os.cpu_count())
print(os.times())
文件与目录操作
import os
# exists & mkdir
if not os.path.exists('newDir'):
os.mkdir('newDir')
# pass
# makgedirs
# 第三个参数:exist_ok = True,文件夹存在不会报错;如果是False且存在,会报错
os.makedirs('a/b/c', 0o733, exist_ok = True);
# rmdir
# 如果文件不存在会报错
try:
os.rmdir('newDir')
except OSError as e:
print(e)
# 删除多级目录
# 如果一级目录下不为空,则不为空的目录不会删除
os.removedirs('a/b/c')
# rename
if not os.path.exists('mydir') and os.path.exists('yourdir'):
os.mkdir('mydir')
os.rename('mydir', 'yourdir')
# renames
if os.path.exists('a/b/c'):
os.renames('a/b/c', 'x/y/z')
# remove删除指定的文件
if os.path.exists('newdir/test.txt'):
os.remove('newdir/test.txt')
# 如果用remove来删除文件夹,会报“拒绝访问”
os.remove('mydir')
软连接和硬连接
'''
Linux/Unix/MaxOS X:
ln 硬连接,是物理文件的镜像
ln -s 软连接,相当于是个快捷方式
'''
import os
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');
用于获取和设置系统信息的函数和变量
import os
print('文件系统路径分隔符:', os.sep)
# win ";" linux ":"
print('环境变量之间的分隔符:', os.pathsep)
print('操作系统名:', os.name)
# os.environ 环境变量
for name, value in os.environ.items():
print('{} = {}'.format(name, value))
# 获取指定的一个环境变量
print('PATH = ', os.environ['PATH'])
print('PATH = ', os.getenv('PATH'))
# 子进程
import subprocess
output = subprocess.getstatusoutput('node -v');
print(output)
# os.system
os.system('dir') # windows
os.system('java -version')
集合(Set)
def printSet(obj):
set1 = set(obj)
print(set1)
# 创建一个集合
printSet(range(10))
# 字符串
printSet('abcdefg')
# 重复的
printSet('HelloKitty')
a = set((1, 2, 3))
b = set([3, 5, 1, 5])
# 并集
print(a.union(b))
print(a | b)
# 交集
print(a.intersection(b))
print(a & b)
# 子集
c = set([2, 3])
print(c.issubset(a)) # True
print(a.issubset(c)) # False
# 超集
print(c.issuperset(a)) # False
print(a.issuperset(c)) # True
# 判断集合是否相等
d = set([1, 3, 2])
print(a == d) # True
# 差集,三种写法
print(a.symmetric_difference(b))
print(a ^ b)
print((a - b) | (b - a))
# copy
x = a.copy()
y = a
print(y is a) # True
print(x is a) # False
# contains
print(1 in a) # True
print(10 in a) # False
将集合作为集合的元素: frozenset
a = set([1, 2])
b = set([10, 20])
# frozenset: 集合变成只读了
a.add(4)
print(a)
a.add(frozenset(b))
print(a)
# for obj in a:
# print(type(obj))
# print(obj)
d = {'Bill': 19, 'Gates': 22}
d[frozenset(a)] = 10
print(d)
t = (1, 2, 3, 4)
b.add(t)
d[t] = 10
print(b)
print(d)
堆(heap)
import heapq
from random import *
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
heap = []
# 向堆中添加元素 heappush
for n in data:
value = choice(data) # 来自random,从数组中任选一个
heapq.heappush(heap, value)
print(heap)
# heappush(heap, 'aaa') 数据类型要一直,否则会报错
heapq.heappush(heap, 300)
heapq.heappush(heap, 301)
print(heap)
# 从堆中取出第一个元素 heappop
print(heapq.heappop(heap))
print(heap)
# 将数组转为heap,重新排列了
data1 = [5, 6, 8, 0, 3]
print(data1) # [5, 6, 8, 0, 3]
heapq.heapify(data1)
print(data1) # [0, 3, 8, 6, 5]
print(heapq.heappop(data1)) # 0
# 删除现有元素并将其替换为一个新值: heapreplace
print(data1)
print(heapq.heapreplace(data1, 123))
print(data1)
# nlargest
print(heapq.nlargest(1, data1)) # 返回“最大的”一个
print(heapq.nlargest(2, data1)) # 返回“最大的”两个
# nsmallest
print(heapq.nsmallest(1, data)) # 返回“最小的”一个
# merge,不去重,可排序
print(list(heapq.merge([5, 4, 6], [1], [98, 888])))
print(list(heapq.merge(['aaa', 'bbbbb'], 'c', ['HelloKitty'], 'c', key=len)))
双端队列
from collections import deque
# 将列表转为双端队列
q = deque(range(10))
print(type(q)) # <class 'collections.deque'>
print(q) # deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(q))
# 添加到队尾
q.append(100)
q.append(101)
# 添加到队首
q.appendleft(-1)
print(q)
# 弹出队尾的值
print(q.pop())
# 弹出队首的值
for i in range(3):
print(q.popleft())
print('pop: ', list(q))
# 向左、向右循环移动
q.rotate(-2)
print(list(q))
q.rotate(4)
print(list(q))
# 向双端队列追加一个双端队列
# 数据类型可以是不一致的
q1 = deque(['a', 'b'])
q.extend(q1)
print(list(q))
q.extendleft(q1)
print(list(q))
时间元组
import time
# 获取当前时间
localtime = time.localtime(time.time())
print(localtime) # localtime是一个对象
print(type(localtime)) # <class 'time.struct_time'>
# 第一个参数是个元组
st = time.struct_time((1, 2, 3, 4, 5, 6, 7, 8, 9))
print(st)
print('年', ':', localtime.tm_year)
'''
tm_year:4位数字的年
tm_mon:月
tm_mday:日
tm_hour:小时
tm_min:分钟
tm_sec:秒
tm_wday:一周的第几日
tm_yday:一年的第几日
tm_isdst:夏令时 1:夏令时, 0:不是夏令时, -1:位置,默认值是-1
'''
# 获取一个刻度的时间
localtime = time.asctime()
print(localtime) # Thu Aug 30 18:00:49 2018
格式化日期和时间
import time
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
时间戳的增量
import time
time1 = time.time()
time2 = time1 + 60 # 加60秒
print(time1, time2)
time3 = time1 - 60*60
time3 = time.localtime(time3)
print(time3)
print(time.strftime('%Y-%m-%d %H:%M:%S', time3))
计算日期和时间的差
import datetime
# 计算日期的差
d1 = datetime.datetime(2019, 5, 5)
d2 = datetime.datetime(2028, 5, 5)
print((d2-d1).days)
print(type((d2 - d1))) # <class 'datetime.timedelta'>
# 计算时间的差
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)
# timedelta 直接用
d1 = datetime.datetime.now()
d2 = d1 + datetime.timedelta(hours=10)
print(d2)
d2 = d1 + datetime.timedelta(hours=-10)
print(d2)
获取某年某月的日历
import calendar
import locale
cal = calendar.month(2018, 1)
print(type(cal)) # <class 'str'>, 额,真的只是个日历,字符串
print(cal)
# locale.setlocale(locale.LC_ALL, "")
print(calendar.calendar(2018))
随机数
import random
'''
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指定的序列中元素的顺序打乱,该函数直接修改原有的序列。
'''
# 1 ~ 100 随机整数
print(random.randint(1, 100))
# 0 ~ 1 之间的随机数
print(random.random())
# 小于20的3的倍数
print(random.randrange(0, 20, 3))
# 1 ~ 100.5的随机浮点数
print(random.uniform(1, 100.5))
# 从列表里面随机选
intList = [1, 2, 3, 4, 5, 6]
print(random.choice(intList))
# 从列表里面随机选三个
newList = random.sample(intList, 3)
print(newList)
# 打乱顺序
random.shuffle(intList)
print(intList)
数学函数
import math
# 圆周率
print('圆周率:', math.pi)
print('自然常数:', math.e)
# abs
print(math.fabs(-1.2))
# 向上取整
print(math.ceil(1.3))
# 向下取整
print(math.floor(1.9))
# 平方
print(math.pow(2, 10))
# 开根号
print(math.sqrt(4))
# 三角函数
print(math.sin(math.pi/2))
print(math.cos(math.pi))
print(math.tan(math.pi/4))
练习1
'''
1. 编写一个Python程序,从一个列表中随机取3个元素值,
并按取值顺序将元素值组成3级目录,然后创建这个3级目录。
例如,有一个列表['a','b','c','d','e'],
现在取的值依次是'a'、'd'、'c',组成的3级目录是“a/d/c”,
然后使用相应的函数创建这个3级目录即可。
'''
import random
import os
dirList = ['a', 'b', 'c', 'd', 'e', 'f']
path = ''
for name in random.sample(dirList, 3):
path += name + os.sep
os.makedirs(path, exist_ok=True)
练习2
'''
编写一个Python程序,从控制台输入两个日期,格式:2011-1-1,
然后计算这两个日期之间相差多少天,并输出计算结果。
如果输入的日期格式错误,会抛出异常,并输出这个异常。
'''
# import datetime
from datetime import *
import math
try:
d1 = input('输入第一个日期(yyyy-mm-dd): ')
d1 = datetime.strptime(d1, '%Y-%m-%d')
d2 = input('输入第二个日期(yyyy-mm-dd): ')
d2 = datetime.strptime(d2, '%Y-%m-%d')
print('两个日期之前相差 {} 天'.format(int(math.fabs((d2-d1).days))))
except Exception as e:
print('日期格式可能不对:', e)