目录
Python的基本语法
定义变量的语法:
a = 10
a = b = c = 20
注释:
''' '''
python在第一行可以指定文件的编码格式:#coding:gbk
数据类型:int, float, bool, str
输出系统的关键字
import keyword
print(keyword.kwlist)
查询对象所存储的内存地址:id(obj)
查询对象的数据类型:type(obj)
将其他数据类型转为字符串:str(obj)
将其他数据类型转为整数:int(obj)
将其他数据类型转为浮点数:float(obj)
格式化输出:
print('name', 200, 30)
print('我的名字是%s, 今年%d岁了' % (name, age))
输入:
password = input('请输入你的密码:')
print('你的密码是:' % password)
运算符:
// 整除 num = 10 // 4
** 次方 num = 2 ** 5
布尔运算符:
not, and, or
is:比较两个对象的内存地址是否相同 print(a is b)
not is:两个对象的内存地址是否不相同 print(a not is b)
in:一个字符串是否在另一个字符串里面 print('a' in 'abcd')
not in:一个字符串是否不在另一个字符串里面 print('a' not in 'abcde')
系列解包赋值: a,b,c = 20,30,40
位运算符: & | << >>
逻辑结构
获取对象的布尔值:bool(obj)
以下对象的布尔值为False,其他任何对象的布尔值都为True
False
数值0
None
空字符串,空列表,空元组,空字典,空集合
单分支结构的语法:
if 布尔表达式:
python语句
双分支结构的语法:
if n % 2:
print('111')
else:
print('222')
多分支结构的语法:
if score > 100:
print('A')
elif score > 90:
print('B')
elif score > 80:
print('C')
else:
print('D')
三目运算:
表达式1 if 条件 else 表达式2
条件成立执行表达式1,不成立执行表达式2
pass语句,什么都不做,只是一个占位符
- range()函数的使用:
- 三种创建range对象的方式: 三个参数分别是:start,stop,step
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---|
| r=range(10) #创建一个[0,9]之间的整数序列,步长为1 print(list(r)) #打印内容 r=range(1,6) #创建一个[1,5]之间的整数序列,步长为1 print(list(r)) #打印内容 r=range(1,20,3) #创建一个[1,4,7....19]之间的整数序列,步长为3 print(list(r)) #打印内容 | |
- 返回值是一个迭代器对象
- range类型的优点:不管range对象表示的整数序列有多长,所有range对象占用的内存空间都是相同的,因为仅仅需要存储start,stop和step,只有当用到range对象时,才会取计算序列中的相关元素
- in与not in 可以判断整数序列中是否存在指定的整数
- range(n):会生成[0,n)的数据序列
- range(a,b):会生成[a,b)的数据序列
- range(a,b,step):会生成[a,b)的数据序列,步长为step
python
# while循环的使用:
sum=0
n=0
while n<=100:
sum+=n
n+=1
print(sum)
python
# for-in循环的使用:
for item in 'python':
print(item)
for item in range(10):
print(item)
item就是一个变量
#如果在循环体中不需要使用到自定义变量,可将自定义变量写为_
for _ in range(5):
print('人生苦短,我用python')
python
# else和for循环和while循环的使用: 当循环不是被break语句退出时 才可以执行else中的语句
for item in range(3):
pwd=input('请输入您的密码:')
if pwd == '8888':
break
else:
print('密码错误,请重新输入!')
else:
print('三次密码都输入错误,账号锁定')
n=3
while n>0:
pwd = input('请输入您的密码:')
if pwd == '8888':
break
else:
print('密码错误,请重新输入!')
n-=1
else:
print('三次密码都输入错误,账号锁定')
函数
python
# 函数的定义:函数可以嵌套定义函数
def 函数名(传入参数):
函数体
return 返回值
#函数的注释有特定的位置书写要求,要写在函数名字的下方
#查看函数的文档注释可以使用函数:help(函数名)
# 有参函数:
def add(a,b):
print(a + b)
# 想要在函数内部修改全局变量的值:
def fun1(): 需要先用global声明这个变量为全部变量,才能修改
global n
n = 200
- 缺省参数:
- 形参,在函数定义的时候,给形参一个默认值,这个形参就是缺省参数。
- 注意点:缺省参数要写在普通参数的后边
- 特点:在函数调用的时候,如果给缺省参数传递实参值,使用的是传递的是实参值,如果没有传递,使用默认值。
python
# 关键字传参,可以不按照参数的定义顺序传参
def fun7(name,age):
print(name)
print(age)
fun7(age=20,name='rose')
python
# 不定长参数:
# 在形参前边加上一个*,该形参变为不定长元组形参,可以接收所有的位置实参
# 在形参前边加上两个*,该形参变为不定长字典形参,可以接收所有的关键字实参
def fun(*args,**kwargs):
print(args)
print(kwargs)
fun(1,2,3,4,5)
fun(a=1,b=4,c=8)
python
# 函数没有返回值,默认返回None
# 函数返回多个值,返回值可以直接返回任何类型,以及多个数据,用逗号分隔即可
def fun6():
return 2,'666'
n1,str5 = fun6()
print(f'{n1}=={str5}')
# 函数作为函数参数
def test(add):
sum = add(10,20)
print(sum)
def add(n1,n2):
return n1+n2
test(add)
python
# 函数的定义中
# def关键字,可以定义带有名称的函数
# lambda关键字,可以定义匿名函数(无名称)
# 有名称的函数,可以基于名称重复使用
# 无名称的匿名函数,只可临时使用一次
# 语法:
# lambda 传入参数: 函数体(一行代码)
def test(add):
sum = add(10,20)
print(sum)
test(lambda x,y: x + y)
列表
列表是python中的一种数据类型,可以存放多个数据,列表中的数据可以是任意类型的
列表list,定义使用[]
python
# 两种创建列表的方式:
list1 = ['hello',100,True];
list2 = list([100,222.22,'world'])
# 获取列表的长度
list1 = [1,2,3]
print(len(list1))
# 索引的范围:
# 正向索引从0到N-1
# 逆向索引从-N到-1
# 指定索引不存在,抛出IndexError
-
列表的特点:
- 列表元素按顺序有序排序
- 索引映射唯一数据
- 列表可以存储重复数据
- 任意树类型混存
- 根据需要动态分配和回收内存
-
获取列表中指定元素的索引:obj.index()
- 如查找列表中存在N个相同元素,只返回相同元素的第一个元素的索引
- 如果查询的元素在列表中不存在,则会抛出ValueError
- 还可以在指定的start和stop之间进行查找
- 获取列表中的多个元素,切片操作:
- 语法: obj[start:stop:step]
- 切片的结果: 原列表片段的拷贝
- step默认为1:简写为 [start:stop]
- step为正数:从start开始往后计算切片
-
:stop:step\] 切片的第一个元素默认是列表的第一个元素
-
- step为负数:从start开始往前计算切片
-
:stop:step\] 切片的第一个元素默认是列表的最后一个元素
-
python
# 列表的遍历
for item in obj
print(item)
-
列表的添加操作:
- append():在列表的末尾添加一个元素,如果添加的是列表,添加的就是列表这一个元素
- extend():在列表的末尾至少添加一个元素,如果添加的是列表,添加的就是列表里面的全部元素
- insert():在列表的任意位置添加一个元素,当前位置以及以后的元素都后移一位
- 切片,obj[1:] = ['hello',222] :切片的数据只能是列表,添加后,原来位置以及后面的元素都会消失
-
列表的删除操作:
- remove(value):一次删除一个元素,重复元素只删除第一个,元素不存在抛出ValueError
- pop(index):删除一个指定索引位置上的元素,指定索引不存在抛出IndexError,不指定索引,删除最后一个元素
- 切片,obj[1:] = [] :将指定下标以及之后的元素全部删除
- clear():清空列表
- del :del list1[3] 删除元素
-
列表的修改操作:
- obj[1:3] = [100,200,300,400,500]:将列表下标[1,3)的数据全部替换为 后面的数据
-
列表的查询操作
- int index(value):根据数据值,查找元素所在的下标,找到返回元素的下标,没有找到,程序报错
- int count(value):查询数据出现的次数
- in:value in list1 存在则返回True
-
列表的排序操作:
- 调用sort方法,列表中所有元素默认按照从小到大的顺序进行排序,可以指定reverse=True,进行降序排序
- 调用内置函数sorted(),可以指定reverse=True,进行降序排序,原列表不发生改变,new_list = sorted(list1)
python
# 列表的逆置:
list2 = list1[::-1]
列表生成式:
list1 = [I * 2 for I in range(1,10)]
元组
- 什么是元组:
- Python内置的数据结构之一,是一个不可变序列
- 创建元组的方式:
- 直接小括号: t = ('Python',100,True)
- 使用内置函数tuple():t = tuple(('hello',11.11))
- 只包含一个元组的元素需要使用逗号和小括号:t = (100,)
- 为什么要将元组设计成不可变序列?
- 在多任务环境下,同时操作对象时不需要加锁
- 因此,在程序中尽量使用不可变序列
- 元组中存储的是对象的引用:
- 如果元组中对象本身不可变,则不能在引用其他对象。
- 如果元组中的对象时可变对象,则可变对象的引用不允许改变,但数据可以改变。
python
# 元组的遍历:
t1=('python',100,True)
for item in t1:
print(item)
字符串
python
# 字符串的定义
s1 = 'abc'
s1 = "abc"
s1 = """abc"""
s1 = '''abc'''
# 用下标访问字符
s1 = 'abcd'
print(s1[2])
# 获取字符串的长度
s1 = 'abcddd'
print(len(s1))
- 字符串的常见操作
- int find(sub_str,start,end):找子串 返回下标 找不到返回-1
- int rfind(sub_str,start,end):从后面开始找子串 返回下标 找不到返回-1
- int index(sub_str,start,end):找子串 返回下标 如果找不到就报错
- int rindex(sub_str,start,end):从后面开始找子串 返回下标 如果找不到就报错
- int count(sub_str,start,end):统计子串出现的次数
- str replace(old_str,new_str,count):替换对应字符串,不改变原字符串,返回新的字符串,默认全部替换
- 列表 split(sub_str,count):默认用空格切割,全部切割
- 列表 rsplit(sub_str,count):从后面开始 默认用空格切割,全部切割
- str join(str):当执行 '_'.join('hello')后 返回:h_e_l_l_o 每两个元素都插入一次
切片操作
-
切片是对操作的对象截取其中一部分的操作
- 切片的语法:变量[start:end:step],会得到一个新的字符串
- start:开始位置的下标
- end:结束位置的下标,不包含end对应的下标
- step:步长,下标之间的间隔,默认是1
- start的位置也可以省略不写,表示是0
- end的位置也可以不写,表示整个字符串的长度,但冒号不能省略
|-------------------|---------|
| print(s1[::-1]) | 字符串逆向输出 |
list1[:3]:取前三个数据
集合
- 什么是集合?
- Python语言提供的内置数据结构
- 与列表,字典一样都属于可变类型的序列
- 集合是没有value的字典
python
# 集合的创建:
set1={'pyhotn',100,True}
print(set1)
- 集合的相关操作:
- 集合元素的判断操作:
- in 或 not in
- 集合元素的新增操作:
- 调用add()方法,一次添加一个元素
- 调用update()方法,至少添加一个元素,如果添加的是列表,则添加的是列表中的元素
- 集合元素的删除操作:
- 调用remove()方法,一次删除一个指定元素,如果指定的元素不存在则抛出KeyError
- 调用discard()方法,一次删除一个指定元素,如果指定的元素不存在,则不抛出异常
- 调用pop()方法,一次只删除一个任意元素
- 调用clear()方法,清空集合
- 集合元素的判断操作:
- 集合间的关系:
- 两个集合是否相等:
- 可以使用运算符 == 或 != 进行判断
- 一个集合是否是另一个集合的子集
- 可以调用方法issubset进行判断
- B是A的子集
- 一个集合是否是另一个集合的超集
- 可以调用方法issuperset进行判断
- A是B的超集
- 两个集合是否没有交集
- 可以调用方法isdisjoint进行判断
- 两个集合是否相等:
python
s1={10,20,30,40,60}
s2={10,20,30,99}
#交集
print(s1.intersection(s2))
print(s1&s2)
#并集
print(s1.union(s2))
print(s1|s2)
#差集
print(s1.difference(s2))
print(s1-s2) #s1-(s1|s2)
#对称差集
print(s1.symmetric_difference(s2))
print(s1^s2)
python
# 集合的定义式:
s = {I * I for I in range(10)}
print(s)
字典
python
# 创建字典的两种方式:
scores={'张三':100,'李四':99,'王五':80}
print(scores)
d1=dict(name='张三',age=20)
print(d1)
python
# 字典中元素获取的两种方式:
scores={'张三':100,'李四':99,'王五':80}
# []取值与使用get()取值的区别:
# []如果字典中不存在指定的key,抛出keyError异常
print(scores['张三'])
# get()方法取值,如果字典中不存在指定的key,返回None
# print(scores.get('张三'))
-
字典的增删改查操作:
- 判断key是否存在: print('张三' in dict1)
- 删除元素: del dict1['张三']
- 添加元素: dict1['小王'] = 100
- 清空字典:dict1.clear()
-
获取字典视图的三种方式:
- keys():获取字典中所有key
- values():获取字典中所有value
- items():获取字典中所有key,value对
python
score={'张三':100,'李四':80,'王五':10}
for item in score.keys():
print(item)
for item in score.values():
print(item)
for item in score.items():
print(item)
for k,v in score.items():
print(k,v)
- 字典的特点:
- 字典中的所有元素都是一个key-value对,key不允许重复,value可以重复
- 字典中的元素是无序的
- 字典中的key必须是不可变对象
- 字典也可以根据需要动态的伸缩
- 字典会浪费较大的内存,是一种使用空间换时间的数据结构
python
# 字典生成式
items=['Fruits','Books','Others']
prices=[100,50,90]
dict1={item:price for item,price in zip(items,prices)}
print(dict1)
enumerate
python
list1 = ['a','b','c']
# 将可迭代对象所在的下标和具体元素组合在一起,变成元组
for i in enumerate(list1)
print(i)
文件
python
f = open(file='1.txt',mode='r',encoding='utf-8')
buf = f.read()
print(buf)
f.close()
-
文件操作的三大步骤:
- 1、打开文件,open()
- 2、读文件 文件对象.read()
- 3、关闭文件 文件对象.close()
-
读文件操作
- open(file,mode='r',encoding=None)
- file,要操作的文件名字,类型是str
- mode,文件打开的方式,r只读打开,w只写打开,a追加打开
- encoding,文件的编码格式,常见的编码格式有两种,一种是gbk,一种是utf-8
- 返回值,文件对象,后序所有的文件操作,都需要通过这个文件对象进行
- 写文件操作
- 1、打开文件方式用w,文件不存在,会创建文件,文件存在,会覆盖清空原文件
- 2、写文件 文件对象.write(写入文件的内容)
- 3、关闭文件
python
# coding=gbk
f = open('a.txt','w',encoding='utf-8')
f.write('你好')
f.close()
python
# 追加操作:
# coding=gbk
f = open('a.txt','a',encoding='utf-8')
f.write('hello world')
f.close()
python
# read(capacity)方法:参数为整形,读几个字节
# readLines():按行读取,一次读取所有行,列表中的每一项是一个字符串,即一行的内容
# 读取大文件的方法:
# 按行读
# coding=gbk
f = open('a.txt','r',encoding='utf-8')
while True:
buf = f.readline()
if buf:
print(buf,end='')
else:
break
f.close()
# 按字节读
# coding=gbk
f = open('a.txt','r',encoding='utf-8')
while True:
buf = f.read(10)
if buf:
print(buf,end='')
else:
break
f.close()
- 文件和目录的操作:
- 对文件和目录的操作,需要导入os模块 import os
- 1、文件重命名,os.rename(原文件路径名,新文件路径名)
- 2、删除文件,os.remove(文件的路径名)
异常
python
# 捕获异常的代码:
try:
可能出现异常的代码
except 异常类型:
处理代码
# 捕获异常的代码:
try:
可能出现异常的代码
except 异常类型:
处理代码
# 捕获多个异常:
try:
code
except (ZeroDivisionError,ValueError) :
code
# 显示异常信息:
try:
可能出现异常的代码
except ValueError as e:
print(e)
# 捕获所有异常:
try:
code
except Exception as e:
code
# 异常的完整结构:
try:
可能发生异常的代码
except Exception as e:
发生异常执行的代码
print(e)
else:
代码没有发生异常,会执行
finally:
不管有没有发生异常,都会执行
# 异常具有传递性:当所有函数都没有捕获异常的时候,程序就会报错
模块和包
python
# 使用模块的方法:模块就是一个python文件,就是一个工具包
import 模块名
模块名.功能名
from 模块名 import 功能名
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名
# 起别名,如果使用了as别名,就不能再使用原来的名字了
import my_module as mm1
- 什么是包:
- 功能相近或者相似的模块放在一个目录中,并在目录中定义一个__init__.py文件,这个目录就是包
python
# 如何导入包内的模块?
import 包名.模块名 as 别名 别名可有可无
python
# main函数
if __name__ == '__main__':
print('main start')
# __all__ = ['fun1','fun2']
__all__出现在模块里,表示外部文件导入该模块时,只能使用列表里面的函数
json和pyecharts
- 什么是json
- json是一种轻量级的数据交互格式。可以按照json指定的格式取组织和封装数据
- json本质上是一个带有特定格式的字符串
python
import json
data = [{'name':'张三','age':11},{'name':'李四','age':20},{'name':'王五','age':15}]
print(data)
# 不使用ASCII码
data = json.dumps(data,ensure_ascii=False)
print(data)
data = json.loads(data)
print(data)
python
# https://gallery.pyecharts.org/#/ 该网站用python代码画图 称为画廊
from pyecharts.charts import Line
line = Line()
line.add_xaxis(['中国','美国','英国'])
line.add_yaxis('GDP',[30,20,10])
line.render()
面向对象
python
# 创建类的方式:
class Dog(object):
name = None
class Dog():
name = None
class Dog:
name = None
# 对象的创建,添加属性:
dog = Dog()
# 给对象添加属性
dog.name = '大黄'
dog.age = 20
# 修改属性值和添加一样,存在就是修改,不存在就是添加
dog.age = 2
python
# 类的行为:成员方法
class Student:
name = None
def say_hi(self):
print(F'hi,{self.name}')
stu1 = Student()
stu1.name = '张三'
stu1.say_hi()
-
self:
- 作为类中方法的第一个形参,再通过对象调用方法的时候,不需要手动的传递实参值,是python解释器自动将调用该方法的对象传递给self,所以self这个形参代表的是对象。
- self就是一个形参的名字,可以写成其他的形参名,一般不修改这个名字。
-
魔法方法
- 在python的类中,有一类方法,这类方法以两个下划线开头和两个下划线结尾,并且在满足某个特定条件的情况下,会自动调用,这类方法,称为魔法方法。
-
init()成员方法作为构造方法使用:
- 调用时机:在创建对象之后,会立即调用。
- 1、用来给对象添加属性,给对象属性一个初始值(构造函数)
- 2、代码的业务需求,都需要执行的代码可以写在这个方法中
- 注意点:如果这个方法中,有除了self之外的形参,那么在创建对象的时候,需要给额外的形参传递实参值。
-
str()方法类似于toString()方法:
- 调用时机:
- 1、print(对象),会自动调用__str__()方法,打印输出的结果是__str__方法的返回值
- 2、str(对象),类型转换,将自定义对象转换为字符串的时候,会自动调用
- 应用:
- 1、打印对象的时候,输出一些属性信息
- 2、需要将对象转换为字符串类型的时候
- 注意点:方法必须返回一个字符串
- 调用时机:
- lt()方法用于比较两个对象的大小:
- le()方法用于比较大于等于和小于等于
- eq()方法用于比较是否等于
- 重写该成员方法,自定义两个对象的比较条件
python
class Student:
name = None
age = None
def __init__(self,name,age):
self.name = name
self.age = age
def __lt__(self,other):
return self.age < other.age
stu1 = Student('张三',20)
stu2 = Student('李四',30)
print(stu1 < stu2)
- del()方法类似于gc机制:
- 析构函数
- 调用时机:
- 对象在内存中被销毁删除的时候(引用计数为0)会自动调用__del__方法
- 1、程序代码运行结束,在程序运行过程中,创建的所有对象和变量都会被删除销毁
- 2、使用del 变量,将这个对象的引用计数变为0,会自动调用__del__()方法
- 应用场景:
- 对象被删除销毁的时候,要书写的代码可以写在__del__()中。
- 引用计数:
- 是python内存管理的一种机制,是指一块内存,有多少个变量在引用
- 1、当一个变量,引用一块内存的时候,引用计数加1
- 2、当删除一个变量,或者这个变量不再引用这块内存,引用计数减1
- 3、当内存的引用计数变为0的时候,这块内存被删除,内存中的数据被销毁
-
私有属性:
- 只需要在原属性名前加上两个下划线
- 目的:保证数据的相对安全
- 想要访问和使用私有属性:定义get和set方法进行访问
-
私有方法:
- 在方法的前边加上两个下划线
- 私有方法不能在类外部访问
- 作用:一般作为类内部的方法使用,不让在外部直接调用
python
# 继承的基本语法
class Animal(object)
代码
# Dog继承了Animal
class Dog(Animal)
代码
# 想要在子类中调用父类的同名方法:
父类名.方法名(self,其他参数)
super().方法名()
# 多继承语法:
class A(B,C) 继承了B和C
pass
python
class Student:
name = None
age = None
var: int = 10
my_list: list = [1,2,3]
my_object: Student = Student()
var_1 = 20 # type: int
ver_2 = 100 # type: int
# 在注释中使用注解
def fun(x: int,y: int):
return x + y
print(fun(10,20))
# 在形参中使用类型注解
def fun2(data: list) -> list:
return data
print(fun2([1,2,3]))
# 对返回值进行注解
-
类方法:
- 使用@classmethod修饰的方法,称为类方法,第一个参数为cls,代表的是类对象自己
-
静态方法:
- 使用@staticmethod修饰的方法,称为静态方法
什么是多态?
多态指的是,同一个行为,使用不同的对象获得不同的状态。
定义函数,通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态。
什么是抽象类?
包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法称为抽象方法
抽象类的作用?
多用于做顶层设计,以便子类做具体实现。
也是对子类的一种软性约束,要求子类必须复写父类的一些方法。
并配合多态使用,获得不同的工作状态。
连接mysql
python
from pymysql import Connection
#获取到mysql数据库的连接对象
conn=Connection(
host='localhost',
port=3306,
user='root',
password='1212'
)
#打印mysql数据库软件信息
print(conn.get_server_info())
#获取到游标对象
cursor=conn.cursor()
#选择数据库
conn.select_db('test')
#执行sql
#cursor.execute('createtabletest_pymysql(idint);')
cursor.execute('select*fromtab1')
result=cursor.fetchall()
print(result)
#cursor.execute("insertintotab1values(20,'rose');")
#提交事务
conn.commit()
#关闭到数据库的连接
conn.close()