卡卡罗特的python学习笔记
- 认真看完你将会得到什么呢?下面是书签,点击就能传送到相应位置
- 安装python
- 安装pycharm
- 字面量
- 数据类型
- 数据类型转换
- 运算符
- 字符串的三种定义方式
- 字符串拼接
- 字符串格式化
- 获取用户输入
- 布尔类型和比较运算符
- if语句的基本类型
- while循环
- for循环
- range语句
- 九九乘法表
- continue和break
- 函数的定义
- 函数的参数和返回值
- 函数的说明文档
- 函数的嵌套调用
- 变量在函数中的作用域
- 数据容器
- 数组list
- 元组tuple()
- 字符串
- 数据容器(序列)的切片
- set集合
- 字典
- 数据容器的通用操作
- 函数
- 匿名函数 lambda 只能写一行不能写多行
- 文件的读取和操作
- 打开文件,读取文件
- 使用for循环循环读取每一行文字
- 关闭文件
- with open() as f: 语法 — 可实现自动关闭文件
- f.flush()
- 写入文件
- 文件追加
- 捕获异常
- 模块
- 模块功能单独导入
- 全部导入
- 模块别名
- 制作自定义模块
- 导入模块不需要运行被导入模块的函数 __main__
- 导入全部的一些问题
- 安装包
- JSON数据格式转换
- 安装pyecharts
- 类的成员方法
- 构造方法
- 私有成员变量/方法
- 私有成员变量无法被直接使用
- 私有成员变量只能在类对象内部中其他方法可以使用
- 课后作业
- 继承----直接在方法的括号里写上要继承的类,新类就会继承老类的变量和方法
- 多继承
- pass
- 复写
- 对父类成员方法或成员属性已经进行过复写但还是想用父类成员属性或方法
- 类型注解------一般在无法直接看出变量类型的时候会添加类型注解,只是备注,写错了也不会导致代码出错
- 函数和方法类型注解
- Union类型 ----- 可以定义联合类型注解
- 多态
- 抽象类----顶层设计
- mySQL下载
- DBeaver数据可可视化软件下载
- sql
- DDL --- 库管理
- DML(数据操作语言): insert数据插入
- DML(数据操作语言): delete数据删除
- DML(数据操作语言): update数据更新
- DQL (数据查询):基础查询
- DQL(分组聚合)
- 使用python操作数据库
- 数据插入
- 自动提交
认真看完你将会得到什么呢?下面是书签,点击就能传送到相应位置
你将会学到python各种字面量,数据类型,相关运算,数据类型转换,循环,函数,作用域,数据容器,数据容器操作,匿名函数,使用函数操作文件的读取和写入,使用别人写好的包,制作自定义包,安装包,使用pycharts实现数据可视化,构造方法,私有成员变量,类的继承,类方法的复写,多态,抽象类(用于顶层设计),mySql的增删改查操作
安装python
下载地址如下: https://www.python.org/downloads/
安装pycharm
下载第二个社区版
https://www.jetbrains.com/zh-cn/pycharm/download/?section=windows
字面量
数据类型
使用type()函数查看数据类型,python没有隐式转换,可别像写js一样乱加减了
print(type(123))
数据类型转换
int() // 字符串可以转整数,但是只能是数字类型的字符串
str() // 万物皆可转字符串
float() // 浮点数转整数会丢失精度
运算符
+ - * / 加减乘除 // 取整除 % 取余 ** 指数幂
字符串的三种定义方式
'123'
"123"
""" ## 约等于模板字符串
123
123
"""
字符串拼接
'12312312321' + '45645654654'
字符串和数字不能拼接,因为数据类型不一样会导致报错
字符串格式化
%s # 将内容转换成字符串放在该位置
%d # 将内容转换成整数
%f # 将内容转换成浮点数
数字类型和浮点数类型可以设置精度 m.n m表示整个数字的宽度,n表示精度 数字中的小数点也会算一个宽度
%4d 数字10就会变成0010 2就会变成0002
%3.2f 数字10就会变成10.00
name = 'jack'
msg = '我是德玛西亚 %s' % name
msg2 = '我是诺克萨斯 %s' % (name, name) # 多个数据
更好的写法
f'123123123{name}123123123{age}'
获取用户输入
num = input("请输入")
布尔类型和比较运算符
False
True
> < == != >= <=
if语句的基本类型
if name == 'jack':
print('我是jack')
if name == 'jack':
print('I am jack')
elif name == 'rouse':
print('I am rouse')
else:
print('I f l you')
while循环
i = 0
while i < 100: # 条件
print('我是傻逼')
i += 1 # 终止循环的条件
for循环
name = '123456'
for x in name:
print(x)
# x = 1, 2, 3, 4, 5, 6
range语句
语法1:
range(num) # 获取一个从0开始到num的数组,不包含num本身
语法2:
range(num1, num2) # 获取一个从num1到num2的数组,不包含num2
语法3:
range(num1, num2, step) # 获取一个从num1开始到num2结束的数组,步长为step
九九乘法表
for i in range(0, 10):
for j in range(1, i + 1):
print(f'{i} * {j} = {i * j} \t', end = '')
print()
continue和break
continue # 跳过单次循环
break # 终止当前循环
函数的定义
def getNameFun():
return 'jack'
print(getNameFun())
函数的参数和返回值
def getNameFun(name):
return name
print(getNameFun('jack'))
# 如果没有name则返回None
函数的说明文档
def func(x, y):
”“”
函数说明
:param x: 形参x说明
:param y: 形参y说明
:return: 返回值说明
"""
函数体
return 返回值
函数的嵌套调用
def func1():
print('123')
func2()
def func2():
print('456')
func1()
变量在函数中的作用域
num = 2
def func(): # 块级作用域
global num # 声明局部变量为全局变量
num = 3
print(num)
数据容器
数据容器主要分5类
列表(list), 元组(tuple), 字符串(str), 集合(set), 字典(dict)
数组list
有多个数据组成的集合
list = [1,2,3,4,5,6]
# list[2] = 3
列表的方法 index(元素) 添加:insert(下标,元素) 追加:append(元素) 删除:del list[下标] 删除元素 删除:list.pop(下标) 从list中取出元素,有返回值
list.remove(元素) 删除列表中第一个元素 list.clear() 直接把list清空为[]
元组tuple()
可以理解为不可编辑的数组(只读),但是元组中的list可编辑
list = (1,2,3,4,5)
list2 = (1,) # 定义只有一个数据的元组,需要在后面加上逗号
# list[2] = 3
元组的方法 index()下标 count()统计个数 len(元组)长度
t1 = (1,2,3,'box')
# print(t1.index('box')) = 3
t2 = (1,1,1,2,2,3)
# print(t2.count(1)) = 3
t3 = (1,2,3,4,5,6)
# print(len(t3)) = 6
字符串
字符串类型不支持修改
如果要使用方法修改,会得到一个新的字符串
方法:
str.index(字符串) # 返回下表索引
str.replace(字符串1, 字符串2) # 返回一个新的字符串,而不是修改原字符串
str.split(分割字符串) str = 'abcdabcdabcd' str1 = str.split('a') # ['', 'bcd', 'bcd', 'bcd']
str.strip() # 去掉字符串前后空格以及换行符
str.strip(字符串) # 去掉前后指定字符串 str = '12321' str1= str.strip('12') # str1 == '3'
str.count('字符串') # 统计字符串在str中出现的次数
数据容器(序列)的切片
语法:
list[起始下标:结束下标(不包含):步长(默认为1)]
list = [0, 1, 2, 3, 4] newList = [0:2:1] # newList = [0,1,2]
newList2 = list[:] 开始和结束不写默认从头到尾,步长不写默认1 print(newList2) # [0, 1, 2, 3, 4]
str = '123456' newStr = str[::2] # newStr = '135'
str = '123' newStr = str[::-1] # newStr = '321'
set集合
定义:
my_set = {1,2,3,4}
set2 = {1,5,6}
my_set = set()
# 集合是无序的,,所以集合不支持下标索引访问
# set是不可以重复的,自动去重
mySet.add(元素) 添加新元素
mySet.remove(元素) 移除元素
mySet.pop() 随机取出一个元素 有return
mySet.difference(set2) 取两个集合的差集: # return 234
mySet.defference_update(set2) 消除两个集合的差集: # return 234 消除集合中相同的,返回新集合
mySet.union(set2) 合并集合 # {1,2,3,4,5,6} 无重复
len() 查询集合数量
集合可以用for循环,不支持while循环,因为没有下标
字典
定义:
my_dict = {key: value}
my_dict = {}
my_dict = dict()
my_dict = {'name': 1, 'age': 18}
key不可以重复,不支持下标索引,可以通过key来找到
item[name][id]
新增元素:my_dict['name'] = '周杰伦'
更新元素:my_dict['name'] = '张学友'
删除元素:my_dict.pop('name')
清空元素:my_dict.clear()
获取字典中全部的key:
my_dict.keys()
keys = my_dict.keys()
print(len(keys)) # 可以通过keys拿到字典的所有键,len函数可以拿到字典的长度
数据容器的通用操作
list() # 将给定的容器转换成列表 字符串转列表是将每个字符列出来,字典转列表是将key全部拿出来组成列表抛弃value
str() # 将给定的容器转换字符串
tuple() # 将给定容器转换为元组
set() # 将给定容器转换为集合
min() # 取最小 字符串比较会查询ASCII值
max() # 取最大
其他的类型无法转换成字典,因为没有键值对
sorted() # 排序函数 从大到小 类似js的sort(a, b)函数 return结果为列表[]
sorted(序列, reverse = True) # 反转,反转=True
函数
def 函数名(c参数):
return 结果
匿名函数 lambda 只能写一行不能写多行
lambda x, y: x + y
文件的读取和操作
# 文件操作分为三步,第一步:打开。第二步:操作。第三步:关闭。
open(name, mode, encoding)
name: 是要打开目标文件命的字符串(可以包含文件所在的具体路径)
mode: 设置打开文件的模式:只读,写入,追加等等
encoding: 编码格式(推荐使用UTF_8) # encoding的顺序不是第三位,所以不能使用位置函数,用关键字函数
只读: r read
写入: w white
追加: a add
打开文件,读取文件
f = open('C:/Users/95369/Desktop/python_study/ceshi.txt', 'r', encoding='UTF-8') # 第一个位置是路径,第二个位置是方法,第三个位置是编码,必须用关键字函数哟
f.read(10) # 10表示读取几个字节,不加就是读取全部,自动换行
f.readlines() # 读取全部行
f.readline() # 读取每一行
使用for循环循环读取每一行文字
for line in open('C:/Users/95369/Desktop/python_study/ceshi.txt', 'r', encoding='UTF-8'):
print(line)
关闭文件
f = open('C:/Users/95369/Desktop/python_study/ceshi.txt', 'r', encoding='UTF-8')
f.close()
with open() as f: 语法 — 可实现自动关闭文件
with open('C:/Users/95369/Desktop/python_study/ceshi.txt', 'r', encoding='UTF-8') as f:
# 操作方法
print(f)
f.flush()
写入文件后刷新 f.close()自带flush()方法
课后小练习
# 计算文件中出现过多少个计算机字符,并将数量存储到新的文件中去
with open('C:/Users/95369/Desktop/python_study/ceshi.txt', 'r', encoding='UTF-8') as f:
index = 0
for x in f:
if x.count('计算机') != -1:
index += 1
with open('C:/Users/95369/Desktop/python_study/ceshi2.txt', 'w', encoding='UTF-8') as f2:
f2.write(str(index))
写入文件
f = open('C:/Users/95369/Desktop/python_study/ceshi2.txt', 'w', encoding='UTF-8')
f.write('123123123') # 如果没有则新建,如果有则覆盖
文件追加
f = open('C:/Users/95369/Desktop/python_study/ceshi2.txt', 'a', encoding='UTF-8')
f.write('123999')
f.write('\n222') # 使用 \n 进行换行
课后练习,剔除测试(试试能不能拿到全部正式的数据)
name,date,money,type,remarks
周杰伦,2022-01-01,100000,消费,正式
刘德华,2022-01-01,300000,收入,测试
霍建华,2022-01-01,200000,消费,正式
蔡徐坤,2022-01-01,600000,消费,正式
张飞红,2022-01-01,400000,收入,测试
杨天宇,2022-01-01,500000,消费,正式
林俊杰,2022-01-01,400000,消费,测试
刘老根,2022-01-01,300000,收入,测试
张本山,2022-01-01,200000,消费,正式
刘晓宇,2022-01-01,200000,收入,正式
马德华,2022-01-01,300000,消费,测试
所悟空,2022-01-01,100000,收入,正式
郭富城,2022-01-01,600000,消费,测试
流星雨,2022-01-01,400000,收入,正式
王力宏,2022-01-01,300000,收入,正式
捕获异常
try:
asd # 报错后执行except
except:
print(1)
else:
print('开心的很,啥异常都没有')
finally:
print('该来的都要来 ')
# 捕获指定异常
except NameError as e:
print('出现变量未定义的异常')
except ZeroDivisionError as e:
print('出现除零的异常')
except (NameError, ZeroDivisionError) as e:
print('捕获了变量未定义或者除以零的异常错误')
# 捕获所有异常
try:
except Exception as e:
print('捕获所有异常')
模块
import time # 导入模块
time.sleep(3) # 程序睡眠三秒
print(111)
模块功能单独导入
from time import sleep
sleep(2)
print(111)
全部导入
from time import * # 和上面的区别是可以不加time.
sleep(3)
模块别名
import time as tt
from time import sleep as ss:
制作自定义模块
my_model.py
def test(a, b):
print(a + b)
test(1, 2)
file.py
import my_model
my_model.test(1, 2)
导入模块不需要运行被导入模块的函数 main
def test(a, b):
print(a + b)
if __name__ == '__main__':
test(1, 2)
导入全部的一些问题
__all__ = ['test']
def test(a, b):
print(a + b)
def test2(a, b):
print(a + b)
# 另外一个文件如果
from model_1 import * # 就只能引入test()方法,第二个不会被引入
安装包
pip install 包名称
JSON数据格式转换
# 转换为JSON
import json
data = [{"name": "长大山"}]
json_str = json.dumps(data, ensure_ascii=False) # 正常转换中文
print(json_str)
# 转换为列表
data2 = '[{"name": "长大山"}]'
json_str2 = json.loads(data2)
print(json_str2)
安装pyecharts
pip install pyecharts
类的成员方法
class Student:
name = '王狗剩'
def say_hi(self):
print(f'大家好,我是{self.name}')
stu = Student()
stu.say_hi()
构造方法
def __init__(self, name, age, tel): # 构造方法
self.name = name
self.age = age
self.tel = tel
# 魔术方法
def __str__(self): # 用于实现类对象转字符串的行为
def __lt__(self): # 用于两个类对象进行小于或大于比较
def __le__(self): # 用于两个类对象进行小于等于或大于等于比较
def __eq__(self): # 用于两个类对象进行相等比较
私有成员变量/方法
class Phone:
__current_voltage = None
def __keep_single_core(self): # 成员私有变量
print('省电模式')
私有成员变量无法被直接使用
class Phone:
def __init__(self):
self.name = '狗剩'
self.age = 18
def __say_dad(self):
print('dad')
tel = Phone()
print(tel.__say_dad()) ### 报错
# Traceback (most recent call last):
# File "C:\Users\EDY\PycharmProjects\pythonProject1\main.py", line 9, in <module>
# print(tel.__say_dad())
# AttributeError: 'Phone' object has no attribute '__say_dad'
私有成员变量只能在类对象内部中其他方法可以使用
class Phone:
def __init__(self):
self.name = '狗剩'
self.age = 18
def __say_dad(self):
print('dad')
def i_want_say_dad(self):
if self.age == 18:
self.__say_dad()
tel = Phone()
tel.i_want_say_dad()
课后作业
class Phone:
__is_5g_enable = True
def __check_5g(self):
if self.__is_5g_enable:
print('5G开启')
elif self.__is_5g_enable:
print('5G关闭,使用4G网络')
def call_by_5g(self):
self.__check_5g()
print('正在童话中')
Phone().call_by_5g()
继承----直接在方法的括号里写上要继承的类,新类就会继承老类的变量和方法
class Phone:
__is_5g_enable = True
def __check_5g(self):
if self.__is_5g_enable:
print('5G开启')
elif self.__is_5g_enable:
print('5G关闭,使用4G网络')
def call_by_5g(self):
self.__check_5g()
print('正在童话中')
class Phone2023(Phone):
face_id = '10001'
def call_by_6G(self):
print('这是新功能哟')
Phone2023().call_by_6G()
Phone2023().call_by_5g()
多继承
class Phone(father1, father2, father3......fathern):
# 如果多个继承中有同名成员属性或成员方法,则按照靠左原则
# 比如father1 和father2中有相同的 name 属性,Phone中调用的时候,则先使用左边的
pass
占位,不想写代码又不想报错的时候
复写
# 子类继承父类的成员属性和成员方法后,如果对其不满意,可进行复写,即:在子类中重新定义同名属性或方法
# 例: iwatch => 华强北S9
class Phone:
name = '小米手机'
def call_by_4g(self):
print('使用4G网络')
class MyPhone(Phone):
name = 'iphone15' # 复写成员属性
def call_by_4g(self): # 复写
print('4G太慢我要开5G')
MyPhone().call_by_4g()
print(MyPhone().name)
对父类成员方法或成员属性已经进行过复写但还是想用父类成员属性或方法
class Phone:
name = '小米手机'
def call_by_4g(self):
print('使用4G网络')
class MyPhone(Phone):
name = 'iphone15' # 复写成员属性
def call_by_4g(self): # 复写
# 使用父类中成员 第一种方法
print(Phone.name) # 使用父类中的变量
Phone.call_by_4g(self) # 使用父类中的方法 括号中必须写self
# 使用父类中成员 第二种方法
print(super().name)
super().call_by_4g() # 括号中无需self
# 方法演示结束
print('4G太慢我要开5G')
MyPhone().call_by_4g()
print(MyPhone().name)
类型注解------一般在无法直接看出变量类型的时候会添加类型注解,只是备注,写错了也不会导致代码出错
# 基础数据类型注解
age: int = 10
height: float = 185.23
name: str = 'will wong'
is_man: bool = True
# 类对象类型注解
class Student:
pass
stu: Student = Student()
# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_dict: dict[str, int] = {'wanggousheng': 1}
# 在注释中进行注解
name = 1 # type: int
函数和方法类型注解
def call(name: str, age: int) -> str: # 形参:类型 -> 返回值类型
print(f'我叫{name},今年{age}了')
call('王狗剩', 18)
Union类型 ----- 可以定义联合类型注解
from ctypes import Union
my_list: list[Union[int, str]] = [1, "str", 2, "haha"]
多态
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
print('汪汪汪')
class Cat(Animal):
def speak(self):
print('喵喵喵')
def mak_noise(animal: Animal):
animal.speak()
dog = Dog()
cat = Cat()
mak_noise(dog)
mak_noise(cat)
抽象类----顶层设计
class AC:
def cool(self):
pass
def hot(self):
pass
def feng(self):
pass
mySQL下载
https://dev.mysql.com/downloads/file/?id=523568
DBeaver数据可可视化软件下载
https://dbeaver.io/download/
sql
SQL的特征
大小写不敏感
需以;号结尾
支持单行、多行注释
sql支持注释:
单行注释: -- 注释内容(--后面一定要有个空格)、
单行注释: # 注释内容(#后面可以不加空格,推荐加上)
多行注释: /* 注释内容 */
SQL语言的分类:
DDL数据定义
DML数据操作
DCL数据控制
DQL数据查询
DDL — 库管理
查看数据库
SHOW DATABASES;
使用数据库
USE 数据库名称;
创建数据库
CREATE DATABASE 数据库名称 [CHARSET UTF8];
删除数据库
DROP DATABASE 数据库名称;
查看当前使用的数据库
SELECT DATABASE();
查看有那些表
SHOW TABLES;
删除表
DROP TABLE 表名称;
DROP TABLE IF EXISTS 表名称;
创建表
CREATE TABLE 表名称(
列名称 列类型,
列名称 列类型,
......
) # 列类型有 int float varchar(长度) 文本,长度为数字,做最大长度限制 date 日期类型 timestamp 时间戳类型
DML(数据操作语言): insert数据插入
insert into 表[(列1, 列2, ...... , 列N)] values(值1, 值2, ...... , 值N)[, (值1, 值2, ...... , 值N), ...... , (值1, 值2, ...... , 值N)]
create table city(
id int,
name varchar(10),
age int
);
insert into city(id) values(1), (2), (3), (4); # 给创建id
insert into city(id, name, age) values(1 , '王少阳', 88), (2 , '王少阳2', 89); # 找到id name age 分别赋值
insert into city values(1 , '王少阳', 88), (2 , '王少阳2', 89); # 可以不写id name age,但值的顺序必须一致
DML(数据操作语言): delete数据删除
delete from 表名称 [where 条件判断]
delete from 表名称 # 删除全部
delete from city where id = 1; # 删除id为1的数据
DML(数据操作语言): update数据更新
update city set name = '王力宏' where id = 1; # 更新表中id=1的 name,将name改为王力宏
DQL (数据查询):基础查询
select id, name from city where id = 1; # 在表city中查询id name 条件是 id = 1
select * from city where name = '狗剩';
DQL(分组聚合)
select 字段|聚合函数 from 表 [where 条件] group by 列 # group by中出现了那个列,select里才能出现谁
sun(列) 求和
avg(列) 求平均值
min(列) 求最小值
max(列) 求最大值
count(列) 求数量
# select age, avg(age), count(age) from city group by age [asc | desc]; 正序 | 倒序
group by # 根据列进行分组
order by # 根据列名称排序
select 列|聚合函数|* from 表 where ... group by ... order by ... [asc | desc] limit n[, m] # 从第N条取,取M条,如果只写N则,只取N条
使用python操作数据库
from pymysql import Connection;
# 引入包
conn = Connection(
host='localhost',
port=3306,
user='root',
password='123456'
)
# 获取到mysql数据库链接对象
cursor = conn.cursor()
# 获取游标对象
conn.select_db("world")
# 选择数据库
data = cursor.execute('select * from city')
results: tuple = cursor.fetchall()
for r in results:
print(r)
# 使用游标执行sql语句
conn.close()
# 关闭数据库链接
数据插入
什么是commit提交? pymysql库在执行对数据库有修改操作的行为是,是需要通过连接对象的commit成员方法来进行确认的。
只有确认的修改,才能生效!!!
from pymysql import Connection;
# 引入包
conn = Connection(
host='localhost',
port=3306,
user='root',
password='123456'
)
# 获取到mysql数据库链接对象
cursor = conn.cursor()
# 获取游标对象
conn.select_db("world")
# 选择数据库
cursor.execute('insert into city values(7, "周杰伦", 31, "男")')
# 使用游标执行sql语句
conn.commit()
# 通过commit确认插入
conn.close()
# 关闭数据库链接
自动提交
什么是自动提交↓↓↓↓↓↓↓
from pymysql import Connection;
# 引入包
conn = Connection(
host='localhost',
port=3306,
user='root',
password='123456',
autocommit=True # 这里链接的时候写上自动提交为True
)
# 获取到mysql数据库链接对象
cursor = conn.cursor()
# 获取游标对象
conn.select_db("world")
# 选择数据库
cursor.execute('insert into city values(8, "郑子丹", 34, "男")')
# 使用游标执行sql语句
# conn.commit()
# 通过commit确认插入
conn.close()
# 关闭数据库链接
相关链接
VUE3脚手架vite
Vue3.0基础
Vue脚手架,Vue-Cli项目初始化
Git教程-Git配置详情
或者访问主页查看更多笔记
还有----卡卡罗特与你同在,正义与我同在,再见