IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 第五章 python标准 -> 正文阅读

[Python知识库]第五章 python标准

# Sys模块

定义

Sys模块主要负责与python解释器进行交互

属性或方法

描述

sys.argv

获取命令行参数列表,第一个参数是程序本身

sys.exit(n)

退出?Python?程序,exit(0)?表示正常退出。当参数非?0?时,会引发一个?SystemExit?异常,可以在程序中捕获该异常

sys.version

获取?Python?解释程器的版本信息

sys.maxsize

最大的?Int?值,在?64?位操作系统上是?263-1

sys.path

返回模块的搜索路径,初始化时使用?PYTHONPATH?环境变量的值

sys.platform

返回操作系统平台名称

sys.stdin

输入相关

sys.stdout

输出相关

sys.stderr

错误相关

len()

获取长度

sys.path.insert(index,字符)

指定下标插入数据

sys.path?=?[]

删除所有路径

sys.getfilesystemencoding()

获取文件系统使用编码方式,默认是?UTF-8

sys.modules

以字典的形式返回所有当前?Python?环境中已经导入的模块

sys.builtin_module_names

返回一个列表,包含所有已经编译到?Python?解释器里的模块的名字

sys.modules.keys()

返回所有已将导入模块的key

sys.flags

命令行标识状态信息列表

sys.getrefcount(object)

返回对象的引用数量

sys.?getrecursionlimit()

返回?Python?最大递归深度,默认为?1000

sys.getsizeof(object[,?default])

返回对象的大小

sys.getswitchinterval()

返回线程切换时间间隔,默认为0.005秒

sys.setswitchinterval(interval)

设置线程切换的时间间隔,单位为秒

sys.?getwindowsversion()

返回当前?Windows?系统的版本信息

sys.hash_info

返回?Python?默认的哈希方法的参数

sys.implementation

当前正在运行的?Python?解释器的具体实现,如?CPython

sys.thread_info

当前线程信息?Python?解释器里的模块的名字

sys.modules.keys()

返回所有已将导入模块的key

sys.flags

命令行标识状态信息列表

sys.getrefcount(object)

返回对象的引用数量

sys.?getrecursionlimit()

返回?Python?最大递归深度,默认为?1000

sys.getsizeof(object[,?default])

返回对象的大小

sys.getswitchinterval()

返回线程切换时间间隔,默认为0.005秒

sys.setswitchinterval(interval)

设置线程切换的时间间隔,单位为秒

sys.?getwindowsversion()

返回当前?Windows?系统的版本信息

sys.hash_info

返回?Python?默认的哈希方法的参数

sys.implementation

当前正在运行的?Python?解释器的具体实现,如?CPython

sys.thread_info

当前线程信息

代码

#argv 获取命令行的参数
import sys
#argv第一个参数必须是文件的信息/程序信息
print(sys.argv)
print(sys.argv[3])
"""
?argv 获取命令行的参数
?argv 的第一个参数/下标的是0的参数,一定会是我们运行文件的信息
"""

注:在cmd里面运行python,语法:python?文件名字?参数1?参数2

多个参数之间用空格隔开

"""
sys.exit() ?0是正常退出,1是不正常退出,无论是不是1都不会报错
"""
for i in [1,2,3,4,5]:
? ? if i == 2:
? ? ? ? sys.exit(1)
? ? print(i) #1

#sys.version python版本号
print(sys.version) #3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)]

#maxsize ?int数值可以最大是263-1
print(sys.maxsize) #9223372036854775807

#path 获取路径,返回一个list
print(sys.path)

#sys.path.insert(index,文件名字) 添加路径
sys.path.insert(0,"temp")
print(sys.path)

#sys.path=[] 删除路径


# sys.modules ?获取我们导入的模块信息,返回一个字典
#print(sys.modules)

#sys.modules.keys() 只获取导入模块的名字
#print(sys.modules.keys())

#导入模块不一定是内建模块,也有可能是我们自己封装的模块
# 获取内建模块的名字
a = sys.builtin_module_names
print(a)

# Os模块

定义

os是和操作系统(windows)进行交互的,提供了访问操作系统底层的接口

Sys模块主要负责与python解释器进行交互

常用方法

方法或变量

用途

os.mkdir('dirname')

生成单级目录,相当于shell中mkdir?dirname

os.makedirs('dirname1/dirname2')

可生成多层递归目录

os.rmdir('dirname')

删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir?dirname

os.removedirs('dirname1')

若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推

os.listdir('dirname')

列出指定目录下的所有文件和子目录,包括隐藏文件并以列表方式打印

os.remove()

删除一个文件

os.rename("oldname","newname")

重命名文件/目录

os.path.abspath(path)

返回path规范化的绝对路径?os.path.split(path)?将path分割成目录和文件名二元组返回

os.path.dirname(path)

返回path的目录

os.path.exists(path)

如果path存在,返回True;如果path不存在,返回False

os.path.isabs(path)

如果path是绝对路径,返回True

os.path.isfile(path)

如果path是一个存在的文件,返回True。否则返回False

os.path.isdir(path)

如果path是一个存在的目录,则返回True。否则返回False

os.path.join(path1[,path2[,?...]])

将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

os.path.getatime(path)

返回path所指向的文件或者目录的最后访问时间

os.path.getmtime(path)

返回path所指向的文件或者目录的最后修改时间

os.path.getsize(path)

返回path的大小

os.getcwd()

获取当前工作目录,即当前python脚本工作的目录路径

os.chdir("dirname")

改变当前脚本工作目录;相当于shell下cd

os.curdir

返回当前目录:?('.')

os.pardir

获取当前目录的父目录字符串名:('..')

os.stat('path/filename')

获取文件/目录信息

代码

import os 

#os.getcwd() 获取当前目录
#print(os.getcwd()) #D:\axc\Python\PythonTemp
"""
绝对路径/全路径:D:\axc\Python\PythonTemp\test.py
相对路径/半路经:Python\PythonTemp\test.py
想要写半路经,你的当前路径和D:\axc\Python\PythonTemp要一样
"""
#os.mkdir() ?创建一个单级文件夹
#os.mkdir("D:\\axc\\Python\\PythonTemp\\temp")
#os.mkdir("temp")

#os.rmdir() ?删除单级空文件夹
#os.rmdir("D:\\axc\\Python\\PythonTemp\\temp")
#os.rmdir("temp")

#os.makedirs() 创建多层文件夹
#os.makedirs("D:\\axc\\Python\\PythonTemp\\test\\2002bigdate")
#os.makedirs("test\\2002bigdate")

#os.removedirs()删除多级空目录
os.removedirs("test\\2002bigdate")


#创建一个文件夹test
#os.mkdir("test")

#在test里面创建一个文件temp.py(手动创建右键创建)

#修改文件名字temp为temp.txt
#os.rename("D:\\axc\\Python\\PythonTemp\\test\\temp.py","test\\temp.txt")

#列出test文件夹里面所有的子文件以及子文件夹
print(os.listdir("test")) #['temp.txt'] ?listdir只列出文件/文件夹名字

#删除test这个文件夹
os.remove("test\\temp.txt")
os.rmdir("test")

#os.path.dirname() 获取路径的父目录(上一级目录)
a = os.path.dirname("D:\\axc\\Python\\PythonTemp\\test.py")
#print(a) #D:\axc\Python\PythonTemp

#os.path.join() 将多个路径进行拼接
b = os.path.join("D:","python","p.py")
#print(b) #D:python\p.py

#os.path.split() 拆分,将文件和文件夹进行拆分.返回一个元组
c = os.path.split("D:\\axc\\Python\\PythonTemp\\test.py")
print(c) #('D:\\axc\\Python\\PythonTemp', 'test.py')

#os.path.exists() 判断文件/文件夹是否存在
os.path.isabs() #判断是否是绝对路径
os.path.isdir() #判断是否是文件夹
os.path.isfile() ?#判断是否是文件

#?文件模式匹配:glob模块

import os
import glob

a = os.listdir("D:\\axc\\Python\\PythonTemp")
#print(a) #只显示文件/文件夹的名字
"""
['.pytest_cache', '.vscode', 'cat.py', 'ClearWindow.py', 'count.py', 'eval.py', 'f.txt', 
'foo.txt', 'out.log', 'sudo.py', 'test.py', '__pycache__', '其他文件.py']
"""
for i in glob.glob("D:\\axc\\Python\\PythonTemp\\*.py"):
? ? print(i)

语法

#glob.glob()?进行模式匹配,返回一个迭代对象

优点

1.打印的是全路径

2.可以进行模式匹配

#日期时间相关 Datetime?模块

定义

日期和时间进行操作的内置模块:time模块、datetime模块和calendar模块

Datetime模块常用的三个类?date??time??datetime

一个文件是一个模块,一个模块里面有多个类,一个类有多个方法

## Date

定义

定义:class?datetime.date(year,?month,?day)

常用的方法和属性

类方法/属性名称

描述

date.max

date对象所能表示的最大日期:9999-12-31

date.min

date对象所能表示的最小日期:00001-01-01

date.resolution

date对象表示的日期的最小单位:天

date.today()

返回一个表示当前本地日期的date对象

date.fromtimestamp(timestamp)

根据给定的时间戳,返回一个date对象

d.year

d.month

d.day

d.replace(year[,?month[,?day]])

生成并返回一个新的日期对象,原日期对象不变

d.timetuple()

返回日期对应的time.struct_time对象

d.toordinal()

返回日期是是自0001-01-01开始的第多少天

d.weekday()

返回日期是星期几,[0,?6],0表示星期一

d.isoweekday()

返回日期是星期几,[1,?7],?1表示星期一

d.isocalendar()

返回一个元组,格式为:(year,?weekday,?isoweekday)

d.isoformat()

返回‘YYYY-MM-DD’格式的日期字符串

d.strftime(format)

返回指定格式的日期字符串,与time模块的strftime(format,?struct_time)功能相同

import datetime
dt=datetime.datetime
print(dt.today()) #2021-10-11 14:48:40.574201
print(dt.now()) #2021-10-11 14:48:40.574201

## Time

定义

class?datetime.time(hour,?minute,?second,?[microsecond[,?tzinfo]]]])

常用的方法和属性

类方法/属性名称

描述

time.max

time类所能表示的最大时间:time(23,?59,?59,?999999)

time.min

time类所能表示的最小时间:time(0,?0,?0,?0)

time.resolution

时间的最小单位,即两个不同时间的最小差值:1微秒

t.hour

t.minute

t.second

t.microsecond

微秒

t.tzinfo

返回传递给time构造方法的tzinfo对象,如果该参数未给出,则返回None

t.replace(hour[,?minute[,?second[,?microsecond[,?tzinfo]]]])

生成并返回一个新的时间对象,原时间对象不变

t.isoformat()

返回一个‘HH:MM:SS.%f’格式的时间字符串

t.strftime()

返回指定格式的时间字符串,与time模块的strftime(format,?struct_time)功能相同

## Datetime

定义

class?datetime.datetime(year,?month,?day,?hour=0,?minute=0,?second=0,?microsecond=0,?tzinfo=None)

date和time类的一个结合

常用方法和属性

类方法/属性名称

描述

datetime.today()

返回一个表示当前本期日期时间的datetime对象

datetime.now([tz])

返回指定时区日期时间的datetime对象,如果不指定tz参数则结果同上

datetime.utcnow()

返回当前utc日期时间的datetime对象

datetime.fromtimestamp(timestamp[,?tz])

根据指定的时间戳创建一个datetime对象

datetime.utcfromtimestamp(timestamp)

根据指定的时间戳创建一个datetime对象

datetime.combine(date,?time)

把指定的date和time对象整合成一个datetime对象

datetime.strptime(date_str,?format)

将时间字符串转换为datetime对象

dt.year,?dt.month,?dt.day

年、月、日

dt.hour,?dt.minute,?dt.second

时、分、秒

dt.microsecond,?dt.tzinfo

微秒、时区信息

dt.date()

获取datetime对象对应的date对象

dt.time()

获取datetime对象对应的time对象,tzinfo为None

dt.timetz()

获取datetime对象对应的time对象,tzinfo与datetime对象的tzinfo相同

dt.replace()

生成并返回一个新的datetime对象,如果所有参数都没有指定,则返回一个与原datetime对象相同的对象

dt.timetuple()

返回datetime对象对应的tuple(不包括tzinfo)

dt.utctimetuple()

返回datetime对象对应的utc时间的tuple(不包括tzinfo)

dt.timestamp()

返回datetime对象对应的时间戳,Python?3.3才新增的

dt.toordinal()

同date对象

dt.weekday()

同date对象

dt.isocalendar()

同date对象

dt.isoformat([sep])

返回一个‘%Y-%m-%d’字符串

dt.ctime()

等价于time模块的time.ctime(time.mktime(d.timetuple()))

dt.strftime(format)

返回指定格式的时间字符串

from datetime import time
a = time(11,59,59)
print(a) #11:59:59

常用方法代码

from datetime import time

print(time.max)  # 23:59:59.999999
print(time.min)  # 00:00:00
print(time.resolution)  # 0:00:00.000001
t = time(12, 15, 40, 6666)
print(t.hour)   # 12
print(t.minute)  # 15
print(t.second)  # 40
print(t.microsecond)  # 6666
print(t.replace(21))  # 21:15:40.006666
print(t.isoformat())  # 12:15:40.006666
print(t.strftime('%H%M%S'))  # 121540
print(t.strftime('%H%M%S.%f'))  # 121540.006666

## Timedeltal

定义

class?datetime.timedelta(days=0,?seconds=0,?microseconds=0,?milliseconds=0,?hours=0,?weeks=0)

timedelta对象表示两个不同时间之间的差值。可以对datetime.date,?datetime.time和datetime.datetime对象做算术运算。

常用的方法

类方法/属性名称

描述

timedelta.min

timedelta(-999999999)

timedelta.max

timedelta(days=999999999,?hours=23,?minutes=59,?seconds=59,?microseconds=999999)

timedelta.resolution

timedelta(microseconds=1)

td.days

天?[-999999999,?999999999]

td.seconds

秒[0,?86399]

td.microseconds

微秒[0,?999999]

td.total_seconds()

时间差中包含的总秒数,等价于:?td?/?timedelta(seconds=1)

import datetime
dt = datetime.datetime 
a = dt.now()
#三天前
#print(a+datetime.timedelta(-3)) #2021-10-08 15:04:18.884703
#三天后三个小时后三秒后
print(a+datetime.timedelta(days=3,hours=3,seconds=10)) #2021-10-14 18:07:36.521323

# 正则

## 元字符

表达式

匹配

.

小数点可以匹配除了换行符\n以外的任意一个字符

|

逻辑或操作符

[]

匹配字符集中的一个字符

[^]

对字符集求反,也就是上面的反操作。尖号必须在方括号里的最前面

-

定义[]里的一个字符区间,例如[a-z]

\

对紧跟其后的一个字符进行转义

()

对表达式进行分组,将圆括号内的内容当做一个整体,并获得匹配的值

## 转义字符\

  1. 把原本的意义去掉。?“.”任意-----“\.”

  2. 添加意义??????“t”-----“\t”制表符

表达式

匹配

\r,?\n

匹配回车和换行符

\t

匹配制表符

\\

匹配斜杠\

\^

匹配^符号

\$

匹配$符号

\.

匹配小数点.

## 预定义匹配字符

表达式

匹配

\d

任意一个数字,0~9中的任意一个

\w

任意一个字母或数字或下划线,也就是A~Z,a~z,0~9,_?中的任意一个

\s

空格、制表符、换页符等空白字符的其中任意一个

\D

\d的反集,也就是非数字的任意一个字符,等同于[^\d]

\W

\w的反集,也就是[^\w]

\S

\s的反集,也就是[^\s]

#\d 匹配数字0-9
a= re.findall("\d","red84")
#print(a) #['8', '4']

#\D \d相反,\d不要的,\D要
a= re.findall("\D","red84")
#print(a) #['r', 'e', 'd']

#\w 匹配字母、数字、下划线
b= re.findall("\w","red84\nred79")
#print(b) #['r', 'e', 'd', '8', '4', 'r', 'e', 'd', '7', '9']

#\W \w的相反
b= re.findall("\W","red84\nred79")
#print(b) #['\n']

#\s 匹配空格、换行符、制表符
c = re.findall("\s","red84\nred79")
#print(c) #['\n']

#\S \s相反
c = re.findall("\S","red84\nred79")
print(c) #['r', 'e', 'd', '8', '4', 'r', 'e', 'd', '7', '9']

重复匹配

表达式

匹配

{n}

表达式重复n次,比如\d{2}相当于\d\d,a{3}相当于aaa

{m,n}

表达式至少重复m次,最多重复n次。比如ab{1,3}可以匹配ab或abb或abbb

{m,}

表达式至少重复m次,比如\w\d{2,}可以匹配a12,_1111,M123等等

?

匹配表达式0次或者1次,相当于{0,1},比如a[cd]?可以匹配a,ac,ad

+

表达式至少出现1次,相当于{1,},比如a+b可以匹配ab,aab,aaab等等

*

表达式出现0次到任意次,相当于{0,},比如\^*b可以匹配b,^^^b等等

#{n} 匹配字符出出现n次
a = re.findall("l{2}","yellow")
#print(a) #['ll']

#{m,n} 匹配最少m次,最多n次
b= re.findall("l{2,4}","I like you,yellow,alllow,allll")
#print(b) #['ll', 'lll', 'llll']

#{m,} 至少是m次上不封顶
c= re.findall("l{2,}","yellow,alll,allll,alllll")
#print(c) #['ll', 'lll', 'llll', 'lllll']

#? 匹配0和1次
d = re.findall("l?","like,yellow")
#print(d) #['l', '', '', '', '', '', '', 'l', 'l', '', '', '']

#+ 至少出现1次
e = re.findall("l+","like,yellow")
#print(e) #['l', 'll']

# * 出现0次到任意次
f = re.findall("l*","like,yellow")
print(f) #['l', '', '', '', '', '', '', 'll', '', '', '']

位置匹配

表达式

匹配

^

在字符串开始的地方匹配,符号本身不匹配任何字符

$

在字符串结束的地方匹配,符号本身不匹配任何字符

\b

匹配一个单词边界,也就是单词和空格之间的位置,符号本身不匹配任何字符

\B

匹配非单词边界,即左右两边都是\w范围或者左右两边都不是\w范围时的字符缝隙

# ?^ 开头
a = re.findall("^1","18539334875")
print(a) #['1']

# ?$ 结尾
b = re.findall("X$","44456789098765432X")
print(b) #['X']

# 贪婪模式/非贪婪模式

“贪婪模式”总是尝试匹配尽可能多的字符;

“非贪婪模式”则相反,总是匹配尽可能少的字符

a = re.findall(".","apple,orange,banaba")
print(a) #['a', 'p', 'p', 'l', 'e', ',', 'o', 'r', 'a', 'n', 'g', 'e', ',', 'b', 'a', 'n', 'a', 'b', 'a']

b = re.findall("^a","apple,orange,banaba")
print(b) #['a']

# re模块

定义

Python编译正则的模块

常用方法

方法

描述

返回值

compile(pattern[,?flags])

根据包含正则表达式的字符串创建模式对象

re对象

search(pattern,?string[,?flags])

第一个匹配到的对象或者None

Match对象

match(pattern,?string[,?flags])

在字符串开头匹配到的对象或者None

Match对象

split(pattern,?string[,?maxsplit=0,flags])

根据模式的匹配项来分割字符串

分割后的字符串列表

findall(pattern,?string,flags)

列出字符串中模式的所有匹配项

所有匹配到的字符串列表

sub(pat,替换字符?,需要替换的字符串)

将字符串中所有的pat的匹配项用repl替换

完成替换后的新字符串

finditer(pattern,?string,flags)

将所有匹配到的项生成一个迭代器

所有匹配到的字符串组合成的迭代器

迭代器里面存放的是match对象

subn(pat,repl,?string[,count=0,flags])

在替换字符串后,同时报告替换的次数

完成替换后的新字符串及替换次数

escape(string)

将字符串中所有特殊正则表达式字符串转义

转义后的字符串

purge(pattern)

清空正则表达式

template(pattern[,flags])

编译一个匹配模板

模式对象

fullmatch(pattern,?string[,?flags])

match方法的全字符串匹配版本

类似match的返回值

# Match对象的方法

方法

描述

返回值

match.group(index)

将match对象拆分成字符串。不写index默认是0

返回match?object中的字符串/元组

match.groups()

将match对象转换成元组

返回由所有分组匹配到的字符串组成的tuple。

match.start(index)

没有参数时,返回匹配到的字符串的起始位置。指定参数(整数)时,返回该分组匹配到的字符串的起始位置

返回int类型

match.end(index)

没有参数时,返回匹配到的字符串的结束位置。指定参数(整数)时,返回该分组匹配到的字符串的结束位置。

返回int类型

match.span(index)

返回一个二元tuple表示匹配到的字符串的范围,即(start,?end)

返回元组

import re
"""
匹配两个单词
两个单词用空格隔开
单词的内容可以是字母可以是数字
"""
zz = re.compile(r"(\w+) (\w+)") 
matchOb = re.match(zz,"I LOVE YOU")
#print(matchOb) #<re.Match object; span=(0, 6), match='I LOVE'>
#match.group(index) 
a = ?matchOb.group() #I LOVE ?默认是0,打印所有的单词(字符串)

a = matchOb.group(1) #I ?打印第一个单词(字符串)
a = matchOb.group(2) #LOVE 打印第二个单词(字符串)
# 报错 a = matchOb.group(3)

#给两个参数
a = matchOb.group(1,2) #('I', 'LOVE') ?打印第一个和第二个单词,返回一个元组
print(a)
# match.groups() 获取所有的单词,返回一个元组
a = matchOb.groups() #('I', 'LOVE') #打印所有
a = matchOb.group(1,2) #('I', 'LOVE') #可以规定打印那几个
print(a)
# match.start(index) ?获取起始参数 ?返回int
a = matchOb.start() # 0
a = matchOb.start(2) #2 第二个单词(LOVE)的起始参数是2

# match.end(index) 获取结束参数 返回int
b = matchOb.end() #6
b = matchOb.end(1) #1 第一个单词的结束参数 
print(b)


#match.span(index) 返回一个元组(start,end)
a = matchOb.span() #(0, 6)
a = matchOb.span(1) #(0, 1)
a = matchOb.span(2) #(2, 6)
print(a)

补充

为什么正则前面要带一个r

如果你想要\,只是一个斜杠,没有特殊意义,我们正则前面要加r

# pprint模块

定义

pprint模块包含一个“美观打印器(PrettyPrinter)”,用于产生美观的数据结构视图。格式化程序生成可以由解释器正确解析的数据结构,并且容易使人阅读

## Printing

使用 pprint 模块的最简单方法是调用 pprint() 方法:

定义

pprint模块包含一个“美观打印器(PrettyPrinter)”,用于产生美观的数据结构视图。格式化程序生成可以由解释器正确解析的数据结构,并且容易使人阅读

"""
`pprint.pprint`(*object*,*stream=None*,*indent=1*, *width=80*, *depth=None*)

indent --- 缩进,width --- 一行最大宽度,
depth --- 打印的深度,这个主要是针对一些可递归的对象,如果超出指定depth,其余的用"..."代替。

             eg: a=[1,2,[3,4,],5]  a的深度就是2; b=[1,2,[3,4,[5,6]],7,8] b的深度就是3

stream ---指输出流对象,如果stream=None,那么输出流对象默认是sys.stdout
"""

代码

from pprint import pprint
data = [("大数据一班",{"张三":18,"李四":20}),
("大数据二班",{"张三":18,"李四":20}),
("大数据三班",{"张三":18,"李四":20}),
("大数据四班",{"张三":18,"李四":20})]

#这种是打印一行
print(data)
pprint(data)
"""
[('大数据一班', {'张三': 18, '李四': 20}),
 ('大数据二班', {'张三': 18, '李四': 20}),
 ('大数据三班', {'张三': 18, '李四': 20}),
 ('大数据四班', {'张三': 18, '李四': 20})]
"""

# Formatting

定义

格式化数据结构

补充:日志的讲解

import logging
from pprint import pformat
data = [("大数据一班",{"张三":18,"李四":20}),
("大数据二班",{"张三":18,"李四":20}),
("大数据三班",{"张三":18,"李四":20}),
("大数据四班",{"张三":18,"李四":20})]

#.basicConfig() 使用默认格式化程序创建 StreamHandler 并将其添加到根日志记录器中,从而完成日志系统的基本配置。如果没有为根日志程序定义处理程序,debug()、info()、warning()、error()和 critical() 函数将自动调用 basicConfig()。
logging.basicConfig(
    #级别排序:CRITICAL > ERROR > WARNING > INFO > DEBUG。
    level=logging.DEBUG,
    #为处理程序使用指定的格式字符串。
    #%(levelname) 日志级别  %(message)s已经记录的消息
    format='%(levelname)s %(message)s',
)
#打印
logging.debug('Logging pformatted data')
#对data进行格式化
formatted = pformat(data)
#Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
for line in formatted.splitlines():
    #Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格)
    #可写可不写
    logging.debug(line.rstrip())

# pickle模块

定义

pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化。

序列化方法

方法功能
pickle.dump(obj, file)将Python数据转换并保存到pickle格式的文件内
pickle.dumps(obj)将Python数据转换为pickle格式的bytes字串
pickle.load(file)从pickle格式的文件中读取数据并转换为python的类型
pickle.loads(bytes_object)将pickle格式的bytes字串转换为python的类型

## dumps()与loads()

"""
dumps(数据类型) 将python转换成二进制
loads(二进制) 将二进制转换成python
"""
import pickle as p 

String01 = "I love you"
a = p.dumps(String01)
print(a) #b'\x80\x03X\n\x00\x00\x00I love youq\x00.'

b = p.loads(a)
print(b) #I love you

## dump()与load()

"""
dump(数据类型,文件对象) 把python转成二进制写入文件
load(文件对象) 把文件中的数据读取成二进制转成python
"""
import pickle as p

list01 = ["小明","翠花","王五","张三"]
#因为只能是二进制的,所以文件要声明成b 。要写进去所以是w
#open("f.txt","x") #创建一个文件
f1 = open("f.txt","wb")
p.dump(list01,f1) #文件是个二进制文件,打不开

f1 = open("f.txt","rb")#r代表的是读
a = p.load(f1)
print(a) #['小明', '翠花', '王五', '张三']

# 文件的操作

## 创建/打开文件

语法

变量名 = open(文件名,打开模式)

## 打开模式

文件的打开模式描述
'r'只读模式,默认值,如果文件不存在,返回FileNotFoundError
'w'覆盖写模式,文件不存在则创建,存在则完全覆盖
'x'创建写模式,文件不存在则创建,存在则返回FileExistsError
'a'追加写模式,文件不存在则创建,存在则在文件最后追加内容
'b'二进制文件模式
't'文本文件模式,默认值
'+'与r/w/x/a一同使用,在原功能基础上增加同时读写功能

代码

#在路径下面创建text.py文件
#f =  open("text.txt","x")

#在桌面上创建test。windows下面\有转义的意思
#f =  open("C:\\Users\\wangyujun\\Desktop\\text.txt","x")

#想要打开的文件进行什么操作,就使用是什么模式
f =  open("text.txt","r")

## 关闭文件

f.close()
#必须关闭文件,因为每次操作都是保存在内存中,并没有真正保存到文件中

## 读文件

常用方法

操作方法描述
<f>.read()读入全部内容
<f>.readline(size=-1)读入一行内容,如果给出参数,读入该行前size长度
<f>.readlines(hint=-1)读入文件所有行,以每行为元素形成列表 如果给出参数,读入前hint行

代码

注意:如果文件是中文,打开之后报错。就按照一下步骤修改

文件--->首选项--->设置--->搜索encoding---->simplified chiese (GBK)

#首先我们要打开一个文件,需要有一个文件的对象
f = open("test.txt","r")

# <f>.read()      | 读入全部内容
#r1=f.read()
#print(r1)

# <f>.readline(size)  | 读入一行内容,如果给出参数,读入该行前size长度  
r2 = f.readline()   
print(r2)  #伟大的中国
r3 = f.readline(2)   
print(r3)  #伟大   

# <f>.readlines(hint=-1) | 读入文件所有行,以每行为元素形成列表 如果给出参数,读入前hint行 
r4 = f.readlines()
print(r4) #['伟大的中国\n', '伟大的人民\n']

#第四种
for i in f.readlines():
    print(i)

## 写文件

常用方法

操作方法描述
<f>.write(s)向文件写入一个字符串或字节流
<f>.writelines(lines)将一个元素全为字符串的列表写入文件
<f>.seek(offset)改变当前文件操作指针的位置,offset含义如下: 0 – 文件开头; 1 – 当前位置; 2 – 文件结尾

代码

#首先我们要打开一个文件,需要有一个文件的对象
f = open("test.txt","w")

#  <f>.write(s)      向文件写入一个字符串或字节流    
s = "少年强则国强"
f.write(s)

# <f>.writelines(lines)    将一个元素全为字符串的列表写入文件  
l = ["馒头","大米","红烧肉"]
f.writelines(l)

#  <f>.seek(offset)    改变当前文件操作指针的位置,offset含义如下:  0  – 文件开头;  1  – 当前位置;  2  – 文件结尾   
f.seek(2)
f.write("zuguo")

## 删除文件

import os
os.remove("test.txt")
#大家先知道怎么使用,我们下一节课就讲解os模块

## with语句

语法? :with open(文件名) as 别名

代码

"""
f =  open("f.txt","rb")
a = f.readline()
print(a)
#打开一个文件,每一次都需要关闭文件
f.close()
"""

#和上面是一样的,只是不需要去关闭流
with open("f.txt","rb") as f:
    a = f.readline()
    print(a)

# json模块

定义

Json**是一种轻量级的数据交换格式**。Json源自JavaScript语言,易于人类的阅读和编写,同时也易于机器解析和生成,是目前应用最广泛的数据交换格式。

#{}是一个对象  []数组
{
    "大数据1班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据2班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据3班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据4班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据5班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据6班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据7班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据8班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据9班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据10班":[{"张三":15,"李四":18,"赵六":20}],

}

## JSON类型转换Python类型对照表

JSONPython
objectdict
arraylist
stringstr
number (int)int
number (real)float
trueTrue
falseFalse
nullNone

常用方法

方法功能
json.dump(obj,fp)将python数据类型转换并保存到json格式的文件内
json.dumps(obj)将python数据类型转换为json格式的字符串
json.load(fp)从json格式的文件中读取数据并转换为python的类型
json.loads(s)将json格式的字符串转换为python的类型

## dumps()与loads()

参数
"""
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
sort_keys =True:是告诉编码器按照字典排序(a到z)输出。如果是字典类型的python对象,就把关键字按照字典排序。
indent:参数根据数据格式缩进显示,读起来更加清晰。一般写2和4
separators:是分隔符的意思,参数意思分别为不同dict项之间的分隔符和dict项内key和value之间的分隔符,
skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
ensure_ascii=True:默认输出ASCLL码,如果把这个该成False,就可以输出中文。

check_circular:如果check_circular为false,则跳过对容器类型的循环引用检查,循环引用将导致溢出错误(或更糟的情况)。
allow_nan:如果allow_nan为假,则ValueError将序列化超出范围的浮点值(nan、inf、-inf),严格遵守JSON规范,而不是使用JavaScript等价值(nan、Infinity、-Infinity)。
default:default(obj)是一个函数,它应该返回一个可序列化的obj版本或引发类型错误。默认值只会引发类型错误。
"""
"""
dumps(python数据) 把python数据转换成json数据
loads(json) 把json数据转换成python数据
"""
import json

print(json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])) # 输出结果:["foo", {"bar": ["baz", null, 1.0, 2]}]
print(json.dumps("\"foo\bar")) # 输出结果:"\"foo\bar" 里面相当于是一个整体
print(json.dumps('\u1234')) # 输出结果:"\u1234"
print(json.dumps('\\'))  # 输出结果:"\\"

#如果sort_keys是False,则随机打印结果,如果sortkeys为true,则按顺序打印
print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)) # 输出结果:{"a": 0, "b": 0, "c": 0}

"""
这里indent是缩进的意思一般写为4 或者2
separators 是( ‘元素之间用逗号隔开’ , ‘key和内容之间’ 用冒号隔开)
这里是 ‘逗号’ , ‘冒号’ 中间的逗号不带引号
"""
print(json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':')))
# 输出结果:[1,2,3,{"4":5,"6":7}]
print(json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4))
"""
这里indent是缩进的意思一般写为4 或者2
separators 是( ‘元素之间用逗号隔开’ , ‘key和内容之间’ 用冒号隔开)
这里是 ‘逗号’ , ‘冒号’ 中间的逗号不带引号
"""
a = json.dumps([1, 2, 3, {'4': 5, '6': 7}], separators=(',', ':')) # 输出结果:[1,2,3,{"4":5,"6":7}]
print (json.loads(a))

#\b就有特殊的意义,单词边界,本身没有什么意思
b = json.dumps("\"foo\bar")
print (json.loads(b)) #"foar  

## dump()与load()

"""
dump(python,文件对象) 把python转换成json格式并保存到文件中
load(文件对象) 把json格式的文件读取转换成python
"""
import json

data = {
    "大数据1班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据2班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据3班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据4班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据5班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据6班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据7班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据8班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据9班":[{"张三":15,"李四":18,"赵六":20}],
    "大数据10班":[{"张三":15,"李四":18,"赵六":20}],

}
with open("f.txt","w") as f:
    a = json.dump(data,f)
    #print(a) #没有返回值,但是数据已经写进去了r

with open("f.txt","r") as f:
    a = json.load(f)
    print(a)

# Python与数据库

创建?

updata------------>dml (数据操作语言) insert------------>dml (数据操作语言) delete------------>dml (数据操作语言) select------------>dql (数据查询语言)

## 创建数据表

语法:?CREATE TABLE IF NOT EXISTS table_name (column_namecolumn_type);

数据类型

类型大小用途
INT或INTEGER4 Bytes整数
CHAR0-255 bytes定长字符串
VARCHAR0-65535 bytes变长字符串
DATEYYYY-MM-DD日期值
TIMEHH:MM:SS时间值或持续时间
YEARYYYY年份值

## 约束

主键自增(int) :primary key auto_increment

## 外键

CONSTRAINT <约束名>
FOREIGN KEY <外键名>(字段名1,字段名2...)
REFERENCES <主表名>(主键字段名)

## 唯一约束

<字段名> <数据类型> UNIQUE

## 非空约束

not null

## 默认约束

<字段名> <数据类型> DEFAULT <默认值>

## 切换数据库

#使用/切换这个数据库: use 数据库名字;

# 增(添加数据)

insert into 表名(列名1,列名2) values(值1,值2)

# 删

delete from 表名 where 表达式 ?#删除单个语句
drop database 库名字; #输出数据库
drop table 表名字;#输出数据表

# 改

更新数据

update 表名 set 列名=值 [where 表达式]

alter?
alter table 旧表名 rename ?to 新表名; #修改表名字
alter table 表名字 modify 列名 (新)数据类型; #修改数据类型 id char(10)---->id int
alter table 表名字 change 旧列名字 新列名字 新数据类型;#修改列名名字?
alter table 表名 drop 列名;#删除某一列
alter table 表名 add 新列名 (新列名)数据类型;#添加一个列
alter table 表名 modify 列名1 数据类型 after 列名字2;#把列1插入到列2后面

# 查

select 要查询的列名1,列名2 from 表名1,表2?
where 表达式1 and/not/or 表达式2
order by 列名字 desc/asc #order by 排序 desc降序 asc升序
limit 数字 #限制查询的条数 limit(2, 5)第2条数据到第5条数据

# python与数据库

# 1.安装pymsql

pip install pymysql

列出软件包清单
? ? pip?list
查看软件包信息
? ?pip?show django

# 2.连接mysql

连接方法


pymysql.connect(host,user, password,port,db,charset)
host:MySQL服务器所在的主机的ip;
user:用户名
password:密码
port:连接的MySQL主机的端口,默认是3306
db:连接的数据库名
charset:当读取数据出现中文会乱码的时候,需要我们设置一下编码;python3默认采用的utf8字符集

?首先打开服务----->启动mysql

代码

import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')
#运行不报错就是可以了

# 3.cursor游标对象

定义

它负责执行我们熟悉的SQL语句

开启游标

# 开启mysql的游标功能,创建一个游标对象; ? ? ? ? ? ? ?
cursor = db.cursor()

常用方法

方法功能
execute(query, args)执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数;
executemany(query, args)执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数

区别是:批量添加的时候executemany比较快

# 要执行的SQL语句,确保数据表中有相应的数据
sql = "select * from exam;"  
# 使用游标对象执行SQL语句;
cursor.execute(sql)

cursor用来查询数据的方法

我们执行完sql语句怎么查询返回的受影响的函数呢,有以下及格方法

方法功能
fetchone()返回一条结果行
fetchmany(size)接收size条返回结果行。如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据
fetchall()接收全部的返回结果行
import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')
#运行不报错就是可以了

# 开启mysql的游标功能,创建一个游标对象;              
cursor = db.cursor()

# 要执行的SQL语句,确保数据表中有相应的数据
sql = "select * from exam;"  
# 使用游标对象执行SQL语句;
cursor.execute(sql)
# 使用fetchone()方法,获取返回的结果,但是需要用变量保存返回结果;
#data = cursor.fetchone() #(1, '张三', 60)  单条数据
#多条数据
#data = cursor.fetchall() #((1, '张三', 60), (2, '李四', 60), (3, '王五', 80))
#两条数据
data = cursor.fetchmany(2) #((1, '张三', 60), (2, '李四', 60))
print(data)
# 断开数据库的连接,释放资源;
db.close()

# 4.操作数据库

创建表

import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')
#运行不报错就是可以了

# 开启mysql的游标功能,创建一个游标对象;              
cursor = db.cursor()

#创建表,字段是id,姓名,年龄,性别
sql = """
CREATE TABLE ceshi(
    id int,
    name varchar(10),
    age int,
    sex char(10)
) 

"""  
# 使用游标对象执行SQL语句;
cursor.execute(sql)
# 断开数据库的连接,释放资源;
db.close()

## 插入数据

插入单条

import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')
#运行不报错就是可以了

# 开启mysql的游标功能,创建一个游标对象;              
cursor = db.cursor()

#插入数据
sql = """
insert into ceshi(id, name, age, sex)
values(%s,%s,%s,%s)
"""  
try:
      # 使用游标对象执行SQL语句;
	cursor.execute(sql,(2,"翠花",19,"男"))
        db.commit()
except Exception as ex:
        print('插入语句错误' + str(ex))
        db.rollback()
finally:
        db.close()

## 插入多条数据

import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')
#运行不报错就是可以了

# 开启mysql的游标功能,创建一个游标对象;              
cursor = db.cursor()

#插入数据
sql = """
insert into ceshi(id, name, age, sex)
values(%s,%s,%s,%s)
"""  
data = [
    (3,"王五",19,"男"),
    (4,"李四",19,"男"),
    (5,"赵六",19,"男")
]

try:
      # 使用游标对象执行SQL语句;
		cursor.executemany(sql,data)
        db.commit()
except Exception as ex:
        print('插入语句错误' + str(ex))
        db.rollback()
finally:
        db.close()

## 查询数据

import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')

# 开启mysql的游标功能,创建一个游标对象;              
cursor = db.cursor()
# 要执行的SQL语句,确保数据表中有相应的数据
sql = "select * from ceshi;"  
# 使用游标对象执行SQL语句;
cursor.execute(sql)
#多条数据
data = cursor.fetchall() 
print(data)
# 断开数据库的连接,释放资源;
db.close()

## 更新数据

import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')

# 开启mysql的游标功能,创建一个游标对象;              
cursor = db.cursor()
# 要执行的SQL语句,确保数据表中有相应的数据
sql = "update ceshi set age=%s, sex=%s where id=%s;"  
try:
       # 使用游标对象执行SQL语句;
		cursor.execute(sql,(50,"女",3)) 
        db.commit()
except Exception as ex:
        print('插入语句错误' + str(ex))
        db.rollback()
finally:
        db.close()

## 删除数据

import pymysql

db=pymysql.connect(host='localhost',
                   user='root',
                   password='123456',
                   port=3306,
                   db='temp',
                   charset='utf8')

# 开启mysql的游标功能,创建一个游标对象;              
cursor = db.cursor()
# 要执行的SQL语句,确保数据表中有相应的数据 
sql = 'delete from ceshi where id=%s'
try:
        cursor.execute(sql, 3)  
        db.commit()
except Exception as ex:
        print('插入语句错误' + str(ex))
        db.rollback()
finally:
        db.close()

# 总结:执行事务

事务机制可以确保数据一致性。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

· 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的各种操作要么都做,要么都不做。

· 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

· 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

· 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

在pymysql模块是默认开启MySQL的事务功能的,MySQL不会自动提交所执行的相关SQL语句。因此,进行"增"、"删"、"改"的时候,一定要使用db.commit()提交事务,否则就看不见所插入的数据。

同时,进行"增"、"删"、"改"的时候,一定要使用try…except…语句,因为SQL语句一旦没有执行成功,我们可以使用db.rollback()回滚到操作之前的状态;当语句执行成功,我们就db.commit()提交事务。

# 数学:math模块

定义

math模块是python中的数学函数模块,进行一些数学计算功能

基本函数

函数用法例子
ceil(x)向上取整操作,返回类型:intceil(3.2) 输出:4
floor(x)向下取整操作,返回类型:intfloor(3.2) 输出:3
pow(x,y)计算一个数x的y次方;返回类型:float,该操作相当于**运算但是结果为浮点pow(2,3) 输出:8.0
sqrt(x)开平方,返回类型:floatsqrt(4) 输出:2.0
fabs(x)对一个数值获取其绝对值操作fabs(-1) 输出:1
copysign(x,y)返回一个符号为y值为x的数值,返回类型:floatcopysign(2, -4)输出:-2.0; copysign(2, 4)输出:2.0
factorial(x)返回一个整形数值的阶乘factorial(3)输出:6
fmod(x,y)取模运算,返回类型:floatfmod(4,2)输出:0.0 fmod(4,5)输出:4.0 fmod(4,3)输出:1.0
fsum([])返回迭代器中值的精确浮点和,返回类型:floatfsum([1.1,2.23]) 输出:3.33 fsum([2.4,4.3]) 输出:6.699999999999999
gcd(a, b)返回a、b的最大公约数,返回类型:intgcd(2,4) 输出:2
isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)判断两个数是否接近,返回类型:True/Falseisclose(0.99,1,rel_tol=0.2) 输出:True isclose(0.9999999999,0.999999999991) 输出:True math.isclose(0.99,0) 输出:False
modf(x)返回x的小数部分和整数部分。两个结果都带有x的符号,并且都是浮点数modf(2.4) 输出:(0.3999999999999999, 2.0)
trunc取整,返回类型:inttrunc(44.3333)输出:44

import math

a = math.ceil(3.2) #向上取整
a = math.floor(3.2) #向下取整
a = math.pow(3,2) #3的2次方
a = math.sqrt(4) #开平方
a = math.fabs(-1) #绝对值 
a = math.copysign(4, -2) #符号是符号,值是数值
a = math.factorial(4) #阶乘  4*3*2*1
a = math.fmod(4,2) #取余
a = math.fsum([2,3])   #迭代器的和
print(a)

## 定义常数

常数名称使用说明
piπ = 3.141592 ...**,可用精度**
ee = 2.718281 ...,达到可用的精度
tauτ = 6.283185 ......,可达到精度
inf无穷大
nan非数字

## 对数和三角函数

函数用法例子
log(n)e**为底数**log(5) 输出结果: 1.6094379124341003
log(n, basic)其他数为底数log(2, 5)输出结果: 0.43067655807339306
log2(n)2为底数log2(5)输出结果: 2.321928094887362
log10(n)10为底数log10(2) 输出结果 0.3010299956639812
sin(x)正弦函数sin(5) 输出结果: -0.9589242746631385
cos(x)余弦函数cos(5) 输出结果: 0.28366218546322625
tan(x)正切函数tan(5) 输出结果: -3.380515006246586

代码

import math

a = math.log(5)
a = math.log(2,5)
a = math.log2(5)
a = math.log10(2)
a = math.sin(5)
print(a)

# random模块(随机数)

常用方法

方法使用说明
random.random()随机生成一个0-1之间的浮点数
random.randint(start,stop)随机生成一个start,stop之间的整数
random.randrange(start,stop,step)随机生成一个start,stop之间的整数
random.choice(sequence)从一个序列中随机选择一个元素
random.shuffle(sequence)随机打乱列表的顺序,原列表发生变化
random.sample(population,k)从集合中随机抽取K个不重复的元素形成新的序列,返回的是一个新的序列,不会破坏原有序列。

## 针对浮点数

import random as ra
"""
random.randint(start,stop) 随机生成一个start,stop之间的整数 
随机产生start-stop之间的整数,包括start和stop。
"""
for i in range(10):
    a = ra.randint(0,10)
    print(a)
   
"""
random.randrange(start,stop,step)  随机生成一个start,stop之间的整数 
1.random.randrange(stop)  不写start,默认是0
2.左开右闭
3.step 步长,间隔
"""
#a = ra.randrange(10) #0-9之间的数据,不包含10
#a = ra.randrange(1,10) #1-10,不包含10
a = ra.randrange(1,10,2) #步长2,相当于奇数
print(a)

## 针对序列类型

import random as ra
"""
random.choice(sequence)  从一个序列中随机选择一个元素 
1.只能从字符串、元组、列表中随机获取
"""
# 
String01 = "I love you"
list01 = ["张三","李四","王五","赵六"] 
tuple01 = (1,2,3)  
# 报错 dict01 = {"张三":14,"王五":20,"李四":40}
# 报错 set01 = {1,2,3,4}
a = ra.choice(String01)
print(a)

# 面向对象

类和对象是面向对象的两大核心

## 类

定义

类是对一群具有相同特征和行为的事物的统称,是抽象的

特征被称为属性,行为被称为方法

语法

类型要符合大驼峰命名
class 类名(object):
? ? def 方法名(self,参数):
? ? ?? ?代码块
? ? def 方法名(self,参数):
? ? ? ?代码块

代码

class animals:
    color = "yellow"
    def sellp(self):
        print("睡觉")
    def eat(self,food):
        print("吃"+food)


dog = animals()
print(dog.color)
dog.eat("骨头") 

## 补充

1.类需不需要参数,比如类名(object)

可以写也可以不写,python3.x中的所有类都继承了object,即使你不写也会默认继承object

2.方法为什么要用self

self是类的实例,并不是一个类

self和java中的this一样,你可以使用this,但是在python中约定俗成的就是self

class animals(object):
    color = "yellow"
    def duixiang(self):
        print(self)
    def sellp(self):
        print("睡觉")
    def eat(self,food):
        print("吃"+food)

class dog(animals):
    def duixiang(self):
        print(self)
"""
self是类的对象,是本类的对象,即使是继承关系,他也是子类的对象,并不是父类的对象
"""
d = dog()
d.duixiang()
an = animals()
an.duixiang()

## 自定义类

#pass是空语句,不做任何事情,只是为了保持结构的完整性
#初始化就相当于我们的构造函数,给参数一个默认值,或者是定义某些参数
class animals():
    def __init__(self,name,color="白色",age=5):
        self.name = name
        self.color = color
        self.age = age
    def eat(self,food):
        print("爱吃"+food)
    def jiao(self,jiaosheng):
        print(jiaosheng)
        print(self)
dog = animals("小白")
dog.eat("骨头")   
        

## 继承

继承:继承就是子类继承父类的特征和行为,python支持多继承,多继承在以后不常用,最多会出现三个继承,因为他很复杂,我们那单继承举例

语法

class 类1(object):
? ? pass
class 类2(object):
? ? pass
class 类3(类1,类2):
? ? pass

代码

"""
定义一个人类
学生类继承人类,同时定义一个花钱的方法
"""
class person():
    def __init__(self,name,sex="男",age=18):
        self.name = name
        self.sex = sex
        self.age = age
    def sleep(self):
        print("睡觉")
    def eat(self):
        print("一天三顿饭")
    def qita(self):
        print("不同的人有不同的任务")
    def show(self):
        s = '姓名:%s,性别:%s,年龄:%d'%(self.name,self.sex,self.age)
        return s


class student(person):
    def huaqian(self):
        print("花钱神兽")

#同样我们可以调用人类中的方法和属性
#继承person类以后,初始化方法也继承过来了,所以一定不要忘了给参数
s = student("小明")
print(s.show())

重点

1.继承完以后我们可以不可以重写方法

2.能不能保留父类的一些方法里面的代码

3.字类可以初始化,可以理解为,字类可以有构造方法吗

4.那么初始化的时候,能不能保留父类的初始化呢

1.继承完以后我们可以不可以重写方法
#学生不应该是个对象,是个类的话更加好操作,那把学生定义成类,他要继承人类
class student(person):
    def huaqian(self):
        print("花钱神兽")
    def qita(self):
        print("学生的任务是:好好学习天天向上")

#继承person类以后,初始化方法也继承过来了
s = student("小明")
print(s.show())
#我们调用其他会发现,调用的是子类的其他,并不是父类的其他
"""
所以我们python也支持重写
1.不同的两个类    2.继承关系      3.方法名,参数相同
"""
s.qita()


2.能不能保留父类的一些方法里面的代码
class student(person):
    def huaqian(self):
        print("花钱神兽")
    def qita(self):
        #调用父类的方法
        super().qita()
        print("学生的任务是:好好学习天天向上")

#继承person类以后,初始化方法也继承过来了
s = student("小明")
"""
可不可以保留这样的一句话,
不同的人有不同的任务,学生的任务是:好好学习天天向上
意思是在父类的基础上重新添加代码
"""
s.qita()

3.字类可以初始化,可以理解为,字类可以有构造方法吗
class student(person):
    def __init__(self, name,hobbit,sex="男", age=18,):
       self.hobbit = hobbit

4.那么初始化的时候,能不能保留父类的初始化呢
class student(person):
    def __init__(self, name, hobbit,sex="男", age=18):
        #引用父类的初始化
        super().__init__(name, sex=sex, age=age)
        self.hobbit = hobbit
s = student("小明","打游戏")
print(s.name)
print(s.age)

# 公有 私有

静态属性:直接写在类里面的是静态属性

动态属性:写在初始化里面的是动态属性,因为它可以改变

静态方法:staticmethod

普通方法:

公有:公共的

私有:不允许外部访问的,私有的

组合起来有:公有静态属性、公有动态属性、公有静态方法、公有普通方法

私有静态属性、私有动态属性、私有静态方法、私有普通方法

## 公有静态属性

class person():
    food = "馒头,公有静态属性" #比如所有的人喜欢吃馒头
    def eat(self): #类内部访问
        print("所有的人喜欢吃"+self.food) 

class student(person):
    def studentEat(self):#派生类访问
        print("学生喜欢吃"+self.food)

#类访问。就是类自己可以访问
print(person.food)

#类内部访问
p = person()
p.eat()

#派生类访问
s =  student()
s.studentEat()

## 私有静态属性

class person():
    __gongju = "手机,私有静态属性"
    def wan(self):#类内部访问
        print(self.__gongju)
    
class student(person):
    def chagang(self):#派生类访问
        print(self.__gongju,"这是能随便查的吗")

#类访问----->报错
#print(person.__gongju )  

#类内部访问
p = person()
p.wan()

#派生类访问--->报错
s= student()
s.chagang()

## 公有动态属性

"""
通过对象访问
类内部可以访问:类的内部的某个方法
派生类可以访问: 类1继承类2,类1是派生类
"""
class person():
    def __init__(self,name,sex,age):
        #以下这些属于公有字段/成员变量
        self.name = name
        self.sex = sex
        self.age =age
    def perShow(self):#类内部访问
        print(self.name)
        print(self.sex)
        print(self.age)

class student(person):
    def show(self):#派生类的使用
        print(self.name)
        print(self.sex)
        print(self.age)

#通过对象访问
p = person("张三","男",18)
print(p.name)

#类内部可以访问
p.perShow()

#派生类可以访问
s = student("小明","男",70)
s.show()

## 私有动态字段

class person():
    def __init__(self,name,phone,idCar):
        self.name = name #公有字段
        self.__phone = phone #私有字段
        self.__idCar = idCar #私有字段
    def perShow(self):#类内部访问
        print(self.name)
        print(self.__phone)
        print(self.__idCar)
    
class student(person):
    def show(self):#派生类的使用
        print(self.name)
        print(self.__phone)
        print(self.__idCar)

#通过对象访问-----失败报错
p = person("张三","11111111111","223456789098865432")
#print(p.name)
#print(p.__idCar)
#print(p.__phone)

#类内部可以访问----成功
p.perShow()

#派生类可以访问----失败报错
s = student("xiaoming","11111111111","223456789098865432")
s.show()

"""
总结:私有的普通字段只能在类的内部访问
"""

## 公有普通方法

class person():
    def drink(self):
        print("所有人都得喝水,公有的普通方法")
    def he(self):#类内部
        self.drink()


class student(person):
    pass

#类对象访问
p = person()
p.drink()

#类内部
p.he()

#派生类访问
s = student()
s.drink()

## 私有普通方法

class person():
    def __wc(self):
        print("厕所,私有普通方法")
    def Wcc(self):#类内部访问
        self.__wc()
class student(person):
    pass

#对象访问----->报错
p = person()
#p.__wc()

#类内部访问---->成功
p.Wcc()

#派生类访问---->报错
s = student()
s.__wc()

## 公有静态方法

"""
静态方法的关键字:staticmethod  [?meθ?d]方法
语法:@staticmethod
"""
class person():
    @staticmethod
    def jiaoliu():
        print("所有的人都有朋友,公有的静态方法")
    def aihao(self):#类内部访问
        self.jiaoliu()

class student(person):
    pass

#对象访问
p = person()
p.jiaoliu()

#类内部访问
p.aihao()

#派生类访问
s = student()
s.jiaoliu()
#类直接访问
person.jiaoliu()

## 私有静态方法

class person():
    @staticmethod
    def __jiaoliu():
        print("所有的人都有朋友,公有的静态方法")
    def aihao(self):#类内部访问
        self.__jiaoliu()

class student(person):
    pass

#对象访问 ---->报错
p = person()
#p.jiaoliu()

#类内部访问
p.aihao()

#派生类访问---->报错
s = student()
#s.jiaoliu()
#类直接访问
#person.jiaoliu()

## 总结

公有静态属性:1.类访问 2.类内部访问 3.派生类访问
私有静态属性:只能类内部访问
------------------------------------------------
公有动态属性:1.类对象 2.类内部访问 3.派生类访问
私有动态属性:只能类内部访问
------------------------------------------------
公有普通方法:1.类对象 2.类内部访问 3.派生类访问
私有普通方法:只能类内部访问
----------------------------------------------
公有静态方法:1.类对象 2.类内部访问 3.派生类访问 4.类直接访问
私有静态方法:只能类内部访问

# 封装

class person():
    #初始化
    def __init__(self,name,sex,age,phone,idCar):
        self.__name = name
        self.__sex = sex
        self.__age = age
        self.__phone = phone
        self.__idCar = idCar
    def eat(self):
        print("吃饭")
    def sleep(self):
        print("睡觉")
    def __wc(self):
        print("wc")
    def show(self):
        print(self.__name )
        print(self.__sex) 
        print(self.__age)
        print(self.__phone)
        print(self.__idCar)

# 多态

一个对象多种形态

举例,比如动物类,所有的动物都要吃饭,但是狗类吃的骨头,猫类吃的鱼

那怎么让一个动物类的吃有多种形式呢,在狗和猫这两个子类中重写eat方法

class animal():
    def __init__(self,name):
        self.name = name 
    def eat(self):
        print("吃饭")
        
class dog(animal):
    def eat(self):
        print("吃骨头")

class cat(animal):
    def eat(self):
        print("吃鱼")

d = dog("哈士奇")
print(d.name)
d.eat()

c = cat("白猫")
print(c.name)
c.eat()

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:39:41  更:2021-12-01 17:42:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:26:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码