Python中常用的六种数据类型
查看数据类型信息:type(),变量无类型,type(变量)查看的是变量存储的数据的类型
数字(Number)
- 整数/int
- 浮点数/float
- 复数/complex :eg.4+3j,以j结尾的为复数
- 布尔/bool
字符串(String)
-
文本
-
只读,不可修改
str.replace(str1,str2,count)
- 将str中的所有str1,替换为str2,此过程不是对str的修改,而是新生成一个字符串。count用于计数,替换次数。
str.split(分割符字符串)
- 分割符字符串将字符串分割为多个字符串,并存放入列表中,返回列表。
str.strip()
- 不传入参数则去除字符串首尾空格及换行符。
- 如果传入参数,如12,则去除字符串中的1,2,会将字符串中的每一个元素都去除。
count与len同其他
列表(List)
-
有序的可变序列。
-
定义:
name_list = []
或者name_list = list()
-
存储上限为2**63-1
-
同时存储不同类型元素
-
元素可重复
-
可修改
列表的方法
list.index(元素)
- 查询元素的下标索引。
- 如果列表中无此元素,则报错。
list.insert(下表,元素)
- 将元素插入到指定位置。
list.append(元素)
- 将指定元素追加到列表尾部。
list.extend(其他数据容器)
- 将其他数据容器的内容取出,依次追加到列表尾部。
list.pop(下标)
- 删除指定下标的元素。
- 同时将删除的元素返回。
del list[下标]
- 删除指定下标的元素
list.remove(元素)
- 删除列表中第一个匹配的元素。
list.clear
- 清空列表。
list.count(元素)
- 统计指定元素的数量。
len(列表)
- 返回列表长度。
元组(Tuple)
-
有序的不可变序列
-
定义:
name = ()
或者name = tuple()
-
元组中如果只有一个数据,那么定义时需要加一个逗号,
t2 = ('hello',)
-
可嵌套
-
不可修改
-
如果元组中嵌套了list,则list中的元素可以修改
tuple.index(元素)
- 查询元素
tuple.count(元素)
- 统计指定元素数量
len(tuple)
- 计算元组长度
集合(Set)
-
无序不重复集合(可自动去重)。
-
定义:name = {}或者name = set{}。
-
不支持下标索引。
-
可以用
for element in set:
对集合进行遍历,不能用while。set.add(元素)
- 添加新元素
set.remove(元素)
- 移除指定元素
set.pop()
- 随机取出一个元素,取出后原集合中该元素不存在
set.clear()
- 清空
set.difference(set1,set2)
- 取set1,set2的差集,即1中有而2中没有的元素,返回一个新的set,原set1,set2不变。
set1.diffreence_update(set2)
- 消除两个集合的差集,在集合1内删除与集合2相同的元素,1变2不变。
set1.union(set2)
- 将两个集合合并并去重,得到新集合,原1,2不变。
字典(Dictionary)
-
无序Key-Value集合。
-
定义:name = {}或者name = dict()。
-
Key不可重复。重复时后面的Key的值会将前面的覆盖掉。
-
Key不可为字典,可以是list等,value则完全不受限,可嵌套字典。
-
Key不可修改,只能修改value,如果Key不存在则新增此键值对。
-
for key in dict:
遍历字典。 -
将字典转换成字符串可以保留键值对,转换成其他类型只能保留值key丢失。
dict.pop(Key)
- 删除Key对应的键值对,并返回删除的Value。
dict.clear
- 清空字典。
dict.keys()
- 获取字典的所有key。
序列切片
- 序列[起始下标:结束下标:步长],起始结束为空则表示从头到尾,步长为空则默认为1,步长为1,则是一个个取,2则间隔一个取一个,负数也可以,返回的是新序列,不影响原序列。
数据类型转换
- int(x)
- float(x)
- str(x)
排序
- sorted(容器,[reverse = True])默认从小到大,reverse为true时则从大到小,返回的结果为列表。
运算符
算术运算符
- + 加
- - 减
- * 乘
- / 除
- // 取整
- % 取余
- ** 指数
复合赋值运算符
c+=a 等效于 c=c+a
- +=
- -=
- *=
- /=
- %=
- **=
- //=
字符串
转义字符
\" ->在字符串中显示为 " 输出
字符串拼接
- str + str
- str + str(int)
字符串格式化
在字符串的位置放置表达式(如1+1)也可进行格式化。
占位符
- %s-字符串
- %d-整数:%5d->将整数的宽度控制在5位,11输出为:空空空11。
- %f-浮点数:%5.2f->将宽度设置为5,精度设置为2,保留两位小数,四舍五入。
- eg.
massage = "Python大数据学科,北京%s期,毕业平均工资:%s" % (class_num, avg_salary)
快速格式化
- 语法:f"内容{变量}",eg.
(f"我是{name},我成立于{set_up_year}")
- 特点:不理会类型,不做精度控制。
数据输入
input
- 输入的类型为string
循环
range
range(起始,结束,步长)
- range(5)取0,1,2,3,4
- range(5,10)取5,6,7,8,9
- range(5,10,2)取5,7,9,
函数
- 组织好的,可重复使用的,用来实现特定功能的代码段。
返回值
- 如果函数没有return,但是仍然会返回值,返回为None,类型为NoneType,且在if判断中None等同于Flase。
全局变量与局部变量
num = 200
def test_a():
print(f"a:{num}")
def test_b():
print(f"b:{num}")
test_a()
test_b()
print(num)
输出结果为200,200,200
num = 200
def test_a():
print(f"a:{num}")
def test_b():
num = 500 # 此处为局部变量,与上方的num无关,
print(f"b:{num}")
test_a()
test_b()
print(num)
输出结果为:200,500,200
num = 200
def test_a():
print(f"a:{num}")
def test_b():
global num # 声明此num为上方全局变量的num
num = 500
print(f"b:{num}")
test_a()
test_b()
print(num)
输出结果为200,500,500
函数参数
位置参数
-
传递的参数和定义的参数的顺序及个数必须一致。
def user_info(name,age,gender); print(xxx) user_info('TOM',20,'男') #位置一一对应
关键字参数
- 调用函数时通过键=值(形参=实参)的形式传参,参数顺序可以打乱,也可以与位置参数混用,但是必须将位置参数放到关键字参数前面。
user(name = 'TOM',age = 20, gender = '男')
缺省参数
- 提供默认值参数,在调用函数时如果传参则可以被覆盖,默认参数必须放在最后面。
def user_info(name, age, gender = '男')
不定长参数
- (一个***)位置传递不定长:
def user_info(*args):
根据传进来的参数位置合并为一个元组**。 - (两个****)关键字传递不定长:
def user_info(**kwargs):
参数是键值对的形式,将所有参数组成字典**。
函数作为参数传递
- 计算逻辑的传递而非数据的传递。
def test_func(computer):
result = computer(1, 2)
print(result)
def computer(x, y):
return x + y
test_func(computer)
匿名函数
-
def关键字,可以定义带有名称的函数,可基于名称重复使用。
-
lambda关键字,可以定义匿名函数(无名称),只可临时使用一次。
定义
-
传入参数:函数体(一行代码)
-
test_func(lambda x, y: x + y)
默认return,无法二次使用。def test_func(computer): result = computer(1, 2) print(result) test_func(lambda x, y : x + y)
-
-
文件操作
打开
open()函数
- open(name, mode, ecncoding),name文件名,mode打开方式,encoding编码格式
- mode有r,w,a三种模式,r只读,w写入,如果文件已存在,则原内容被删除,并从头开始写入,如果不存在则创建新文件。a追加,如果文件已存在,则追加写入新内容,如果不存在也会新建。
关闭
close()函数
- 如果文件没有关闭,且程序没有结束,那么文件将一直被程序占用。内置了flush功能刷新。
文件对象的方法
read()
- f.read(num),num表示要从文件读取的数据的长度,单位是字节,如果没有传入num,那么表示读取文件所有内容。
- 如果在一个程序中多次调用read,那么上一个read结束的地方就是下一个read开始读取的地方。readlines也会受到影响。
readlines()
- 按照行的方式一次性读取所有内容,返回一个列表,其中每一行的数据为一个元素。
with open()
- with open(“python.txt”,“r”) as f:操作完成后自动关闭文件。
write()
- f.write(写入内容)
flush()
- 内容刷新,f.flush()
异常
捕捉常规异常
tey:
可能发生错误的代码
except:
如果出现异常执行的代码
#捕获指定的异常,如下只捕获NameError异常
try:
xxx
except NameError as e:# 有异常则执行except下的内容
xxx
else: # 可选项,如果没有异常,则执行else下的代码
xxx
finally: # 可选,无论是否有异常,都会执行finally下的内容
-
- 如果是except Exception则捕获全部异常。
异常的传递
- main函数中调用func1,而func1中调用了func2,当func2发生异常时,会将异常传递到main中。
模块
__all__
__all__ = ['test_A']#all为列表
def test_A:
xxx
def test_B:
xxx
当其他文件调用这个模块时如果写成from mode import * ,则表示调用mode模块中的所有,即all内的所有方法。但B不在all内,所以无法使用B。
自定义包
- 只有package中有__init__.py才算是包,否则就是文件夹。init文件中可以放入上面提到的all列表
- 引用的方法:from package import def(使用时:module.def)或者import package.module(使用时:package.module.def)
python数据与json数据转换
- json即列表内嵌字典的数据类型——tyoe为字符串。
python转json
json = json.dumps(python)
- 转成了字符串。
json转python
python = json.loads(json)
- 转成了字典或者多条数据时是列表内嵌字典。
pyecharts模块
- 文档:pyecharts - A Python Echarts Plotting Library built with love.
- 画廊文档:中文简介 - Document (pyecharts.org)
- ab173网站,自动格式化json数据
全局配置项
文档:全局配置项 - pyecharts - A Python Echarts Plotting Library built with love.
set_global_opts()函数可设置配置项如下:
- title_opts——标题
- legend_opts——图例
- tooltip_opts——提示框
- toolbox_opts——工具箱
- brush_opts——区域选择组件
- xaxis_opts——X轴
- yaxis_opts——Y轴
- visualmap_opts——视觉映射
- datazoom_opts——区域缩放
- graphic_opts——原生图形元素组件
- …
类与对象
- 定义一个类:
class 类名:
类的定义
class class_name:
# 类的属性:即类中定义的变量
# 类的方法,即类中定义的函数
# 创建类对象的方法
# 对象 = 类名称()
self参数
-
def 方法体(self, 形参1, 形参2, ...)
-
self关键字是成员方法定义的时候必须填写的。
-
它用来表示类对象自身的意思
-
当我们使用类对象调用方法的时候,self会被自动传入
-
在方法内部想要访问类的成员变量必须使用self,否则在方法内无法使用成员变量。
class Student: bame = None age = None def say_hi(self): print(f"大家好,我是{self.name}")
-
构造方法__init__()
-
在创建类对象(构造类)的时候,会自动执行。
-
在创建类对象(构造类)的时候,将传入参数自动传递给__init__**()**用。
class Student: bame = None age = None tel = None # 上面三个可以不写,如果写了,下面的就是在赋值,如果没写,下面就是声明并赋值 def __init__(self, name, age, tel): self.name = name self.age = age self.tel = tel print("student类创建了一个对象") stu = Student('周杰伦', 31, '12323534667')
-
面向对象的三大主要特征
封装
- 封装的概念:将现实世界事物在类中描述为属性和方法,即为封装。
- 私有成员的实际意义:在类中提供仅供内部使用的属性和方法,而不对外开放。
私有成员变量及私有成员方法
- 定义:在私有成员变量或方法的名称前加上__即可。
__current_voltage = None
def __keep_single_core(self):
- 调用私有成员变量不报错也不生效。但如果print则也会报错。
- 调用私有成员方法会报错没有这个方法。
- 私有成员无法被类对象直接使用,但是可以被类中的其他成员使用。
继承
- 单继承:
class 类名(父类名):
- 继承分为单继承和多继承。
- 继承表示将从父类那里继承(复制),来成员变量与成员方法(不包含私有)
- 多继承:
class 类名(父类1,父类2,父类3...):
- 多个父类中如果有同明成员,那么默认以继承顺序从左到右为优先级,左边高于右边。
- 即先继承的被保留,后继承的被覆盖。
复写
类型注解
# 基础数据类型注解
var_1: int = 10
var_2: str = 'zifuchuan'
var_3: bool = True
# 变量名:类型 = 赋的值
# 类对象类型注解
class Student:
pass
stu: Student = Student()
#类对象: 类名 = 类名()
# 基础容器类型注解
my_list: list = [1,2,3]
my_tuple: tuple = (1,2,3)
my_dict: dict = {'ex':123}
# 容器类型详细注解
my_list: list[int] = [1,2,3]
my_tuple: tuple[int, str, bool] = (1,'zifuchuan',True)# 元组设置类型详细注解时需要将每一个元素都标记出来
my_dict: dict[dict, int] = {'ex':123}
# 在注释中进行类型注解
class Student:
pass
var_1 = random.randint(1, 10) # type: int
var_2 = json.loads(data) # type: dict[str, int]
var_3 = func() # type: Student
# 类型注解的限制
# 类型仅仅是提示性的而非决定性的
var_1: int = 'zifuchuan'# 这样的注解并不会报错。
函数(方法)的类型注解
- def 函数/方法名 (形参名:类型,形参名:类型):
def add(x:int, y:int):
def func(data:list):
函数(方法)的返回值类型注解
- def 函数/方法名(形参名:类型,形参名:类型)-> 返回值类型:
def func(data:list) ->list:
Union联合类型注解
from typing import Union
my_list:list[Unon[str, int]] = [1, 2, 'zifuchuan1', 'zifuchuan2']
my_dict:dict[str, Union[str, int]] = {'name':"zifuchuan", "age":31}
def func(data:Union[int, str]) ->Union[int, str]:
pass
多态
-
多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。
-
以父类做定义声明
-
以子类做实际工作
class Animal: def speak(self): pass class Dog(Animal): def speak(self): print('汪汪汪') class Cat(Animal): def speak(self): print('喵喵喵') def make_noise(animal: Animal): animal.speak() dog = Dog() cat = Cat() make_noise(dog)# 输出汪汪汪 make_noise(cat)# 输出喵喵喵
-
抽象类/接口
-
包含抽象方法的类,称之为抽象类或者接口,抽象方法指没有具体实现的方法(pass)称之为抽象方法。
class Animal: # 抽象类:含有抽象方法的类称为抽象类。 def speak(self): pass # 抽象方法:方法体是空实现的(pass)称之为抽象方法。 class Dog(Animal): def speak(self): print('汪汪汪') class Cat(Animal): def speak(self): print('喵喵喵')
抽象类的作用
- 多用于顶层设计(设计标准),以便子类做具体实现。也是对子类的一种软性约束,要求子类必须复写/实现父类一些方法。
闭包
-
定义双层嵌套函数,内层函数可以访问外层函数的变量。内层函数即闭包函数。
-
将内层函数作为外层函数的返回,此内层函数就是闭包函数。
def outer(logo): def inner(msg): print(f"<{logo}>{msg}<{logo}>") return inner fn1 = outer("外层logo参数")#此处返回的是inner函数,fn1type为func fn1("内层msg参数")
-
好处与缺点
- 优点:不定义全局变量,也可以让函数持续访问和修改一个外部变量。
- 优点:闭包函数引用的外部变量,是外层函数的内部变量。作用域难以被误操作修改。
- 缺点:额外的内存占用。
nonlocal关键字
def outer(num1):
def inner(num2):
nonlocal num1
num1+=num2
print(num1)
return inner
fn = outer(10)
fn(10) # 输出20
fn(10) # 输出30
装饰器
- 装饰器就是使用创建一个闭包函数,在闭包函数内调用目标函数。
- 可以达到不改动目标函数的同时,增加额外的功能。
装饰器的一般写法(闭包写法)
def outer(func):
def inner():
print("我要睡觉了")
func() # 此处调用了传入的参数函数sleep
print("我起床了")
return inner
def sleep():
import random
import time
print("睡眠中")
time.slepp(random.randint(1, 5))
fn = outer(sleep)
fn()
装饰器的语法糖写法
def outer(func):
def inner():
print("我要睡觉了")
func() # 此处调用了传入的参数函数sleep
print("我起床了")
return inner
@outer
def sleep():
import random
import time
print("睡眠中")
time.slepp(random.randint(1, 5))
sleep()#直接调用sleep函数,结果与上方一般写法一致
设计模式
- 待完善
多线程并行执行
- 待完善
网络编程
- 待完善