Python | 学习笔记

[toc]

Python简介

孕育于1989,现在更新至3.0版本(PY3K)

  • 是一种跨平台计算机程序设计语言
  • 解释型语言:没有编译的环节
  • 交互式语言:可以在提示符>>后直接执行代码
  • 面对对象语言
  • 初学者最好的语言

环境配置:

  1. 安装Python解释器
  • 自带简单开发环境IDLE
  • 交互式命令行程序
  1. 安装集成开发环境Pycharm

发展方向

Web全栈开发方向

  • 掌握技术
    • 数据开发
    • 数据库管理
    • 后台框架技术
  • 职业方向
    • Web全栈开发工程师

数据科学方向

  • 掌握技术
    • 数据库管理
    • 数据分析
    • 数据可视化
    • 制作数据看板
    • 实现数据指标监控
  • 职业方向
    • 数据产品经理
    • 量化交易
    • 初级BI商业分析师

仍智能方向-机器学习

  • 掌握技术
    • 机器学习常用算法思想
    • 搭建机器学习模型,对一些应用场景进行智能化
  • 职业方向
    • 数据分析工程师
    • 机器学习算法工程师
    • 搜索算法工程师
    • 推荐算法工程师

人工智能方向-深度学习

  • 掌握技术
    • 深度学习常用框架
    • 自行搭建图像相关算法,实现图像分类、人脸识别
    • 自行搭建NLP常见算法,实现文本分类、问答系统
    • 掌握GAN网络相关算法,实现图像自动上色、图像美化等
  • 职业方向
    • 人工智能工程师

转义字符

在需要实现转义功能的首字母前使用反斜杠\,但最后一个字符不可以是反斜杠

  • 反斜杠\\
    • 不加的话,https://两个斜杠就只显示一个了
  • 单引号\'
    • 如果只想输出一个单引号(比如在字符串里包含想要输出的单引号),在它的前面加上反斜杠就ok
  • 双引号\"
  • 换行\n
  • 回车\r
    • 回车以后,hello就被覆盖了只剩下world
  • 水平制表符\t
    • 之所以只有三个空格,其实是因为每四个字母为一个制表符,hello的o占了第二个制表符的第一个位置,所以按下制表符会往后三个空格,形成第二个制表符
  • 退格\b
    • 退格以后hello的o就没有了
1
2
3
4
5
6
7
8
9
10
#转义字符
#\n表示换行,结果会换行输出
print('hello\nworld')

#\t制表符(Tab),其实就是四个空格的宽度
print('hello\tworld')

#原字符,不希望字符串里的转义字符起作用,就在字符串之前加上`r` `R`
print(r'hello\tworld')

二进制和字符编码

8 bit = 1 byte
1024 byte = 1KB
1024 KB =1 MB
1024 MB = 1 GB
1024 GB = 1 TB

八个位置可以表示256个状态,由此制作ASCII字符代码表对应不同字符。

1
print(chr(0b100111001011000)) # 打印结果是 “乘”

保留字

1
2
3
#查看保留字列表
import keyword
print(keyword.kwlist)
1
2
#输出结果
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

有一些单词被赋予特定的含义,不可以用于编程。

1
2
import keyword
print(keyword.kwlist)

[‘False’, ‘None’, ‘True’, ‘and’, ‘as’, ‘assert’, ‘async’, ‘await’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]

以上就是python里的保留字

标识符

变量、函数、类、模块和其他对象起的名字就是标识符,就是变量、函数、类、模块和其他对象起的名字

规则如下:

  • 字母、数字、下划线
  • 不能以数字开头
  • 不能是保留字
  • 严格区分大小写

注释

  • 单行注释#
  • 多行注释,没有单独的多行注释符号,一般认为一对三引号之间的代码就是多行注释
  • 中文编码声明注释,指定源码文件的编码格式
    • #coding:gbk
    • #coding:utf-8
1
2
3
4
5
#coding:gbk
# 单行注释符号
'''多

注释'''

变量多次赋值后,变量名会指向新的空间

数据类型

常用数据类型

  • 整形int
  • 浮点数float
  • 布尔类型bool
  • 字符串类型str

整数类型

integer,可以表示正数负数和零

进制 表示方式
十进制
二进制 0b
八进制 0o
十六进制 0x

使用时,需要把表示方式放在数字前,例如

1
2
3
4
print('十进制', 365)
print('二进制', 0b000101101101)
print('八进制', 0o555)
print('十六进制', 0x16D)

输出时可以表示为二进制0b、十进制、八进制0o、十六进制ox

1
2
3
4
5
#0b是二进制
print('二进制',0b10101111)
#0o是八进制

#0x是十六进制

浮点类型

不精确性

由整数部分和小数部分组成。有储存不精确性(例如用浮点数进行运算,有时候会小数位数不确定)。

解决方案:导入模块decimal

1
2
from decimal import Decimal
print(Decimal('1.1')+Decimal('2.2'))# 3.3

布尔类型

Boolean

  • 用于表示真或假
  • 可以转成整数计算(可以输出为0或1),可以用来表示真假的值,true是整数1,false是整数0。
1
2
3
f1=True
f2=False
print(f1+1)

字符串类型

不可变的字符序列,可以使用单引号、双引号、三引号、多引号定义

  • 单引号和双引号定义的字符串必须在一行
  • 三引号可以跨行
1
2
3
4
5
6
7
8
9
str1 = '悟已往之不鉴,知来者之可追'
str2 = "悟已往之不鉴,知来者之可追"
str3 = """悟
已往之不鉴,知来者之可追
。"""
print(str1)
print(str2)
print(str3)
print(str3,type(str3))

数据类型转换

1
2
3
int()#转化为int类型
str()#转化为str类型
float()

数据类型转换函数,从而可以把不同类型的数据拼接在一起

1
2
3
name='张三'
age=20
print('我叫'+name+',今年'+str(age)+'岁')

三个转换函数

  • str()
  • int()
  • float()

注意

  • str
    • 其他数据类型转str,也可以用引号转换
  • int
    • str转int,字符串为 数字串
    • float转int,截取整数舍去小数
    • str转int,字符串必须是数字串(整数),小数串、非数字串不能转换
  • float
    • int转float,末尾为.0

变量

内存中一个带标签的盒子

name[变量名] =[赋值运算符] ‘卢本伟’[值]

组成

  • 标识:表示对象所储存的内存地址,使用内置函数id(obj)来获取
  • 类型:表示对象的数据类型,使用内置函数type(obj)来获取
  • 值:表示对象存储的具体数据,使用print(obj)来打印输出

[变量名]=‘[值]’
[变量名][赋值运算符][值]

相当于把东西放进盒子里

组成部分:

  • 标识
    • 表示对象所存储的内存地址,用id(obj)来获取
  • 类型
类型
整数类型 int
浮点数类型 float
布尔类型 bool
字符串类型 str
1
2
3
4
name='ljubenwei'
print('标识',id(name))
print('类型',type(name))
print('值',name)

对变量多次赋值,变量会指向新的空间

一般都可以用str()转成字符串类型,如果字符串要转成整数类型或浮点类型,字符串内容必须是整数或者小数(非数字串不允许转换)

函数

输出函数

  • 输出内容
    • 数字
    • 字符串
    • 含有运算符的表达式
  • 输出目的地
    • 显示器
    • 文件
  • 输出形式
    • 换行
    • 不换行

Code Runner的使用方法是:
选中需要运行的代码,Ctrl+Alt+J选择语言,然后就会开始输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#2023/3/3
#加井号代表注释

#可以输出数字
print(520)

#可以输出字符串,需要加引号
print('Hello World')
print("Hello World")

#可以输出含有运算符的表达式,输出的是表达式的结果
print(3+1)

#将数据输出到文件中,
fp=open('C:/text.txt','a+')#a表示用读写的方式打开,+表示如果不存在就追加
print('HelloWorld',file=fp)
fp.close

#不进行换行输出(输出内容在一行中,用逗号分隔)
print('a','b','c')

输入函数

input()

1
2
present = input('你想要什么礼物呢?')
print(present)
1
2
3
4
5
6
a=input('请输入一个加数')
b=input('请输入另一个加数')
print(a+b) #结果是1020,因为此时数据类型是字符串
a=int(a)
b=int(b) #进行数据类型的转换
print(a+b) #结果就是相加的结果

运算符

常用运算符

  • 算数运算符
    • 标准算数运算符
      • 加+
      • 减-
      • 乘*
      • 除/
      • 整除//,只取整,一正一负向下取整
    • 取余运算符%,一正一负要负数
    • 幂运算符**
  • 赋值运算符
    • 从右向左
    • 支持链式赋值
    • 支持参数赋值
    • 支持系列解包赋值
  • 比较运算符
  • 布尔运算符
  • 位运算符

比较运算符

  • >, <, >=, <=, !=
  • ==
    • 对象value的比较
  • is, is not
    • 对象的id(标识)的比较

比较运算符的结果是布尔类型:True或False

1
2
3
4
5
6
7
8
a = 10
b = 10
print(a == b) #True, 说明a、b的value相等
print(a is b) #True,说明二者id标识相等
list1=[11, 22, 33, 44]
list2=[11, 22, 33, 44]
print(id(list1))
print(id(list2))

布尔运算符

  • and
    • 全真为真
  • or
    • 全假为假
  • not
    • 取反
  • in
  • not in

位运算符

  • 位与&
  • 位或|
  • 左移运算符<<
    • 高位溢出舍弃,低位补0
  • 右移运算符>>
    • 低位溢出舍弃,高位补0

位与

十进制
数字1 0 0 0 0 0 1 0 0 4
数字2 0 0 0 0 1 0 0 0 8
结果 0 0 0 0 0 0 0 0 0

位或、位非的运算同理

优先级

算术运算(先加减后乘除) -> 位运算(移位、位与、位或) -> 比较运算 -> 布尔运算(与、或、非) -> 赋值运算符

列表

列表的特点

  • 列表元素按顺序有序排列
  • 索引映射唯一一个数据
    • 正序从0开始
    • 倒序第几就是第几
  • 列表可以存储重复数据
  • 任意数据类型混存
  • 根据需要动态分配和回收内存

1
2
print(list1[0],list1[-3])
# 打印的分别是第一个元素、倒数第三个元素

创建

变量可以储存一个元素,而列表可以储存多个元素,程序可以方便地对这些数据进行整体操作。列表相当于其他语言当中的数组

一切皆对象,有

  • id
  • type
  • value

列表需要使用中括号[],元素之间使用英文的逗号进行分隔

  • 使用中括号[]
  • 调用内置函数list()
1
2
list1=['hello','world',98]
list2=list(['hello','world',98])

生成式

列表生成式简称“生成列表的公式”

[i*i for i in range(1,10)]
[表示列表元素的表达式 for 自定义变量 in 可迭代对象]

range()函数的使用

  • 用于生成一个整数序列
  • 起始值默认为0
  • 步长默认为1

range(start, stop, step)

创建方式

1
2
3
range(stop) #创建一个(0, stop)之间的整数序列,步长为1
range(start, stop) #创建一个(start, stop)之间的整数序列,步长为1
range(start, stop, step) #创建一个(0, stop)之间的整数序列,步长为1

返回值是一个迭代器对象

优点

  • 不管range()对象多长,占用的内存空间都是相同的,因为它只储存起点、终点、步长。只有具体用到对象时,才会去计算序列中的相关元素。
  • in和not in判断整数序列中是否存在(不存在)指定的整数

查找

获取列表中指定元素的索引
index()

  • 如查列表中存在N个相同元素,只返回相同元素中第一个元素的索引
  • 如查询的元素在列表中不存在,抛出ValueError
  • 还可以在指定的startstop中进行查找

获取单个

获取列表中单个元素

  • 正向索引从0到N-1
  • 逆向索引从-N到-1
  • 指定索引不存,抛出ValueError

获取多个元素

切片操作,语法格式[start:stop:step]

  • 切片的结果
    • 原列表片段的拷贝
  • 切片的范围
    • [start,stop)
  • step默认为1
    • 简写为[start:stop]
  • step为正数,从start开始往后计算切片
    • [:stop:step]切片第一个元素默认是列表的第一个元素
    • [start::step]切片的最后一个元素默认是列表的最后一个元素
  • step为负数,从start开始往前计算切片
    • [:stop:step]切片第一个元素默认是列表最后一个元素
    • [start::step]切片最后一个元素默认是列表第一个元素

添加元素

方法 描述
append() 在列表末尾添加一个元素
extend() 在列表末尾至少添加一个元素
insert() 在列表任意位置添加一个元素
切片 在列表任意位置添加至少一个元素

删除

方法/其他 操作描述
remove() 一次删除一个元素,重复元素删除第一个,元素不存在抛出ValueError
pop() 删除一个指定索引位置上的元素,指定索引不存在抛出IndexError,不指定索引,删除列表中最后一个元素
切片 一次至少删除一个元素,会得到一个新的列表对象
clear() 清空列表
del 删除列表

修改

  • 为指定索引的元素赋予一个新值
  • 为指定的切片赋予一个新值
1
2
3
1st=[10,20,30,40]
1st[2]=100
print(1st)

排序

  • 调用sort()方法,对原列表中所有元素默认按照从小到大的顺序进行排序,可以指定reverse=True(默认reverse=False升序排序),进行降序排序。
  • 调用内置函数sorted(),可以指定reverse=True,进行降序排序,原列表不发生改变,产生一个新列表。
1
2
3
4
#调用sort方法对原列表操作
lst=[40,20,30,10]
lst.sort() #默认reverse=False升序排序
print('排序后的列表',lst,id(lst))
1
2
3
4
5
#调用内置函数sorted产生新列表
lst=[40,20,30,10]
new_lst=sorted(lst) #默认reverse=False升序排序
print('排序后的列表',lst,id(lst))
desc_lst=sorted(lst,reverse=True) #指定关键字参数,实现降序排序

流程控制

任何算法都可以用顺序结构、选择结构、循环结构组成

Python一切皆对象,所有对象都有一个布尔值
bool()

False

  • False
  • 数值0
  • None
  • 空字符串
  • 空列表
  • 空元组
  • 空字典
  • 空集合
1
2
3
4
5
6
7
8
9
10
11
12
print(bool(False))
print(bool(0))
print(bool(0, 0))
print(bool(None))
print(bool(''))
print(bool(""))
print(bool([])) #空列表
print(bool(list())) #空列表
print(bool(())) #空元组
print(bool(tuple())) #空元组
print(bool({})) #空字典
print(bool(dict())) #空字典

顺序结构

选择结构

单分支结构

例如选择结构只有if

双分支结构

有if也有else

多分支结构

类似于case?!

1
2
3
4
5
6
7
score = int(input('请输入一个成绩:'))
if score >= 90 and score <= 100:
print('A级')
elif score >= 80 and score <= 89:
print('B级')
elif score >= 70 and score <= 79:
print('C级')

嵌套

1
2
3
4
5
6
7
8
9
if answer == 'y':
if money >= 200:
print('222')
elif money >=:
print('333')
else:
print('444')
else:
print('555')

条件表达式

是if…else的简写

1
2
3
4
5
6
if A>B:
print('A大')
else:
print('B大')
#上下两端代码等效
print('A大' if A>B else 'B大')

循环

大纲

  • range()函数的使用
  • 循环结构
    • while循环
    • for-in循环
  • break、continue与else语句
  • 嵌套循环

循环的类型有

  • while
  • for-in

while循环

  • 用于次数不固定的循环
  • 初始条件不成立一次都不执行
1
2
3
4
a = 1;
while a<10:
print(a)
a+=1

四部循环法

  • 初始化变量
  • 条件判断
  • 条件执行体(循环体)
  • 改变变量

1到100之间的偶数和

1
2
3
4
5
6
a=2
Sum=0
while a<101:
Sum+=a
a+=2
print(sum)
1
2
3
4
5
6
7
8
a=2
Sum=0
#也可以这样
while a<=100:
if a%2==0:
Sum+=a
a+=1
print(Sum)

利用布尔值判断

1
2
3
4
5
6
7
8
a=2
Sum=0
#也可以这样
while a<=100:
if not bool(a%2):
Sum+=a
a+=1
print(Sum)

for-in循环

可用于遍历可迭代对象。in表达从(字符串、序列等)中依次取值,又称为遍历。遍历的对象必须是可迭代对象

1
2
3
4
5
for item in 'Python':
print(item)

for i in range(10):
print(i)

如果在循环体内用不到自定义变量,可以将自定义变量写为“_”

1
2
for _ in range(5):
print('人生苦短,我用Python')

也可以用for-in解决加和问题

1
2
3
4
5
for item in range(1, 101):
if item%2==0:
sum+=item

print('1到100之间的偶数和为:', sum)

水仙花数

1
2
3
4
5
6
for item in range(100,1000):
ge=item%10 # 取模得到个位数
shi=item//10%10 # 整除10再取模
bai=item//100 # 整除100
if ge**3+shi**3+bai**3==item:
print(item)

break、continue与else语句

  • break语句
    常用于结束循环结构,通常与分支结构if一起使用

  • continue语句
    用于结束当前循环,进入下一次循环,通常与分支结构中的if一起使用

通常输出5的倍数会用余数等于五的条件进行判断,而使用continue可以反向操作:

1
2
3
4
for item in range(1,51):
if item%5!0=0:
continue
print(item)

  • else
    if不成立的时候执行else,没有遇到break的时候执行else

嵌套循环

1
2
3
4
for i in range(1,10):
for j in range(1,i+1):
print(i,'*',j,'=',i*j,end='\t')
print()

二重循环中的break和continue

二重循环中的break和continue用于控制本层循环

1
2
3
4
5
6
for i in range(5):
for j in range(1,11):
if j%2==0:
continue
print(j,end='\t')
print()

pass空语句

什么也不做,只是一个占位符,用在语法上需要语句的地方。

  • if语句的条件执行体
  • for-in语句的循环体
  • 定义函数时的函数体