Python学习笔记(1)——基本中的基本知识
Python3学习日志
基础篇
- 环境:
- python 3.8.2
- OS: Windows10 1909
数据类型
python3中的数据类型:
刚一接触python,就发现python对数据类型的区分并不如C那样敏感,定义一个变量甚至不需要预先加上各种前缀,而这在C/C++中是非常不可思议的
-
按修改可否:
-
常量:值固定的一串数据,不可被修改
-
变量:其值可被修改的一串内存空间,用来标识它的名称(变量名)须符合变量命名规范
- 只能由连续的字母、数字和下划线组成,且不能以数字开头,要避免与关键字和函数名冲突)
-
基本类型
整数
- 整数
- 字面意思,和数学领域中一样,单纯的不包含小数点的整数
浮点数
- 浮点数
- 所有带小数点的数
- Python中涉及到含小数位的运算,可能会产生与逻辑结果相悖的结果
字符串
- 字符/字符串
- 在Python中似乎并没有严格区分字符和字符串,而是统一将其定义为了string类型,''和""的效果也完全相同,但不可混用,单双引号必须各自成对,只有在嵌套时才要错开使用
- eg.
print('She say:"Hello, World"!')
- eg.
- 字符串可使用
+运算符进行拼接 - 字符串的格式化函数
- 大写改小写小写改大写(大小写逆转):
变量名.title() - 全部格式化为大写:
变量名.upper() - 全部格式化为小写:
变量名.lower() - 删除字符串中的多余空白:
变量名.strip()- 只删除开头的多余空白:
变量名.lstrip() - 只删除结尾的多余空白:
变量名.rstrip()
- 只删除开头的多余空白:
- 大写改小写小写改大写(大小写逆转):
- 在Python中似乎并没有严格区分字符和字符串,而是统一将其定义为了string类型,''和""的效果也完全相同,但不可混用,单双引号必须各自成对,只有在嵌套时才要错开使用
强制类型转换
-
数字与字符的误读问题
-
不需事先定义变量类型虽然带来了方便,但是在python中可能会出现数字或字符/字符串被误读的情况,此时需使用强制类型转换
-
str()/int()/float()函数
- eg.
vatr1 = str(12)
- eg.
-
函数 描述 将x转换为一个整数
将x转换为一个长整数
将x转换到一个浮点数
创建一个复数
将对象 x 转换为字符串
将对象 x 转换为表达式字符串
用来计算在字符串中的有效Python表达式,并返回一个对象
将序列 s 转换为一个元组
将序列 s 转换为一个列表
转换为可变集合
创建一个字典。d 必须是一个序列 (key,value)元组。
转换为不可变集合
将一个整数转换为一个字符
将一个整数转换为Unicode字符
将一个字符转换为它的整数值
将一个整数转换为一个十六进制字符串
将一个整数转换为一个八进制字符串
加强的数组
- 前面也提到了,因为python中并不需要对变量的数据类型预先声明,所以下面的三种数据类型都可以看作是某种拥有特定格式的“数组”,包括:
- 列表
- 元祖
- 字典
列表
- 列表:可以存入任意数据类型的元素,以方扩号进行声明,与C/C++相似
- 每一个元素对应一个索引/下标
- 索引/下标从0开始
- 以逗号分隔元素
- 列表内元素可以动态增删修改
- 声明格式:
eg_list = ['Suziki', 123, 'Yamaha', 3.14159, 5]
索引的使用
- 列表名后跟上含索引值的方括号,即可使用某一索引位的元素
- 示例:
eg_list[0]eg_list[3] - 注意:索引值为负时,会从列表右侧开始获取元素,如:
- 获取最后一位元素:
eg_list[-1] - 获取倒数第三位元素:
eg_list[-3]
- 获取最后一位元素:
增删修改
-
修改:
- 类似变量重定义,先利用索引固定到某一元素,然后对其重新赋值
- 示例:`eg_list[-1] = 'kawasaki'
-
添加/插入:
- 末尾添加:
- 格式:列表名.append(元素值)
- 示例:
eg_list.append('911')
- 表中插入:
- 格式:列表名.insert(索引值,元素值)
- 示例:
eg_list.insert(6,'seven')
- 末尾添加:
-
删除:
-
del按索引删除:
-
pop弹出:
-
默认弹出末尾(栈顶)元素
-
示例:
-
print(eg_list) print(eg_list.pop()) print(eg_list) ------- ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911, 'seven'] seven ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911]
-
-
弹出指定位置元素
-
格式:列表名.pop(索引值)
-
示例:
eg_list = ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911] print(eg_list) print(eg_list.pop(3)) print(eg_list) ------- ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911] 3.14159 ['Suzuki', 123, 'Yamaha', 'Kawasaki', 911]
-
-
注意:用pop()方式弹出相当于将列表中的某一个元素移出该列表,此时会将该元素作为pop()函数返回值返回
-
-
remove按值删除:根据指定值移出表中的元素,无返回值
-
格式:列表名.remove(值)
-
示例:
eg_list = ['Suzuki', 123, 'Yamaha', 3.14159, 'Kawasaki', 911, 'seven'] eg_list_remove = 'Kawasaki' eg_list.remove(eg_list_remove) print('The ' + eg_list_remove + ' is too expensive for me') --------- The Kawasaki is too expensive for me -
注意:使用remove移出元素时,默认只会根据顺序,移除匹配到的第一个元素
-
-
排序
-
按字母排序
-
sort()
-
格式:列表名.sort() //括号内可加参数,如reverse=TRUE,即反转顺序,由z向a排序
-
示例:
eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] print('-'*6 + 'before sort ' + '-'*6) print(eg_list) eg_list.sort() print('-'*6 + 'after sort ' + '-'*6) print(eg_list) print("") eg_list = ['Suzuki' ,'Yamaha', 'Kawasaki', 'seven'] print('-'*6 + 'before sort ' + '-'*6) print(eg_list) eg_list.sort(reverse=True) print('-'*6 + 'after sort ' + '-'*6) print(eg_list) ==================Run===================== ------before sort ------ ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] ------after sort ------ ['Kawasaki', 'Suzuki', 'Yamaha', 'seven'] ------before sort ------ ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] ------after sort ------ ['seven', 'Yamaha', 'Suzuki', 'Kawasaki'] -
注意:
- 使用sort()对列表进行排序后无法撤销操作,列表的原有顺序无法溯回
- sort()排序只能对str类型的列表排序,若列表含数值类型的元素则会报错
- sort()排序默认按照以大写字母优先,先对大写字母按顺序排好,再对小写字母进行排序
- sort()函数无返回值
-
-
sorted():
-
说明:sorted()和sort()操作效果相同,但是不会对原列表造成更改,只会返回一个按sort()方式排序好的列表
-
格式:sorted(列表名)
-
示例:
eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] print('-'*6 + 'before sorted ' + '-'*6) print(eg_list) print(sorted(eg_list)) print('-'*6 + 'after sort ' + '-'*6) print(eg_list) ==================Run===================== ------before sorted ------ ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] ['Kawasaki', 'Suzuki', 'Yamaha', 'seven'] ------after sort ------ ['Suzuki', 'Yamaha', 'Kawasaki', 'seven']
-
-
-
逆转顺序reverse()
-
格式:列表名.reverse()
-
示例:
eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] print('-'*6 + 'before reverse ' + '-'*6) print(eg_list) print('-'*6 + 'after reverse ' + '-'*6) eg_list.reverse() print(eg_list) ==================Run===================== ------before reverse ------ ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] ------after reverse ------ ['seven', 'Kawasaki', 'Yamaha', 'Suzuki'] -
注意:
- reverse()函数会对原列表顺序造成更改,但再逆转一次就可恢复
- reverse()无返回值
-
测长
-
测量列表长度:len()
-
格式:len(列表名)
-
示例:
eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] print('eg_list\'s length is: ' + str(len(eg_list))) ==================Run===================== the length of eg_list length is: 4 -
注意:len()返回的长度值从1开始计数,与人类逻辑一致
-
切片
之所以说列表是增强版的数组,不光是因为其可以搭配各种函数使用,更是因为它拥有强大的切片功能——截取某一区间的元素
-
格式:列表名[索引值1:索引值2]
-
示例:
eg_list = ['Suzuki', 'Yamaha', 'Kawasaki', 'seven'] print(eg_list[1:3]) -
注意:
- 切片可用在for循环中
for eg_list in eg_lists[:-1] - 如果起始和结束位不省略,则无法到达结束位,默认为半闭半开区间,即结束位只到其索引值-1处
- 对于
eg_list[0:3],只截到索引为0, 1, 2的三个元素
- 对于
- 起始和结束位都可省略
eg_list[:-1]:表示从开头截取到最后一位eg_list[1:]:表示从索引1一直截取到列表最后eg_list[:]:表示从开头截取到列表最后
- 切片可用在for循环中
元组
- 元组:实际上元组只是列表的常量版,是一种只可以被重新定义,但不可修改元素的特殊列表
- 与列表区别:元组使用圆括号进行声明,元素不可修改
- 操作:除涉及到修改的操作外,其余操作和列表完全相同,可遍历,可切片
- 其中切片方式与列表相同,使用方括号
[]而不是圆括号()
- 其中切片方式与列表相同,使用方括号
字典
如果说列表还只是数组增强版,那么字典完全就是被魔改成另一个东西的存在了,它通过元素两两构成
键-值对的方式存储数据,二者间互相关联,通过键(keys)就可以得到值(values)
-
格式:
字典名 = {'键1':'值1', 键2:'值2', '键3', 值3} -
空字典:
字典名 = {} -
示例:
# 可以看到,字典内包含了多种对象 # 当然,实际应用中并不推荐存入这么混乱的数据 eg_dict = {'key0':'value0', 1:['va','lue',1], 'key2': {'key':2}} print(eg_dict) ==================Run===================== {'key0': 'value0', 1: ['va', 'lue', 1], 'key2': {'key': 2}} -
注意:
- 字典中
键-值对的数量不受限制
- 字典中
-
值可以是任意对象,包括但不限于数字、字符串、列表、字典
-
添加键-值对
-
示例
eg_dict['key3'] = 12 eg_dict[4] = 'key4' print(eg_dict) ==================Run===================== {'key0': 'value0', 1: ['va', 'lue', 1], 'key2': {'key': 2}, 'key3': 12, 4: 'key4'}
-
-
删除键-值对
-
示例:
del eg_dict[4] print(eg_dict) ==================Run===================== {'key0': 'value0', 1: ['va', 'lue', 1], 'key2': {'key': 2}, 'key3': 12}
-
值
-
访问值
-
示例:
print(eg_dict[key0]) ==================Run===================== value0
-
-
修改值
eg_dict['key0'] = 're_value0' ==================Run===================== re_value0
键
-
获取键:
eg_dict.keys() -
示例:
name = eg_dict.keys() print(name)
遍历
-
遍历键-值对
-
函数:
items() -
示例:
for key,value in eg_dict.items(): print('-'*10) print('key:\t' + str(key)) //因为字典中包含非字符串类型数据,无法直接进行拼接 //所以使用str()将字典内所有元素强制转换为字符串类型 print('value:\t' + str(value))
-
-
遍历键/值
-
示例:
for key in eg_dict.keys(): print(key) for values in eg_dict.values(): print(values)
-
-
按顺序遍历键
-
说明:因为在python中,并不关心字典的顺序,只在乎键-值之间的关联关系,所以在获取字典元素时,元素的顺序往往不可预测
-
解决办法:使用sorted()
-
示例:
for eg_dict_sort in sorted(eg_dict.keys()): print(name)
-
##### 嵌套
- 说明:字典的嵌套一般分为三种:
- 列表中嵌套字典
- 字典中嵌套列表
- 字典中嵌套字典
> 因为在一开始介绍字典的格式匙,便使用过了字典嵌套列表和字典嵌套字典,列表也只是将内部元素改为了字典,故不再赘述
#### 集合
- 说明:
- 集合set()一个内置函数,可将括号内的对象转换为集合对象
- 集合中的数据唯一确定,不可重复,因此可用它来消除其余对象中的重复部分
- 使用:
```python
eg_arrg = set(eg_dict.values)
运算符
python中的运算符还是相当丰富的,各种运算几乎都能被囊括在内
分类
-
算术运算符
+ - * / % ** //- 加减乘除:
+ - * / - 取模(除法的余数):
% - 幂(x的y次方):
** - 取整除(返回商的整数部分):
//
- 加减乘除:
-
比较运算符
== != > < >= <=- 返回布尔值
-
赋值运算符
= += -= *= /= %= *= //=- 右结合,先在右侧运算算术部分,再向左赋值
-
位运算符
& | ^ ~ << >>- 按位与
& - 按位或
| - 按位异或
^ - 按位取反
~ - 左移右移
<< >>
- 按位与
-
逻辑运算符
and or not-
布尔与
and -
布尔或
or -
布尔非
not -
运算符 逻辑表达式 描述 实例 and x and y 布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 (a and b) 返回 20。 or x or y 布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 (a or b) 返回 10。 not not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 not(a and b) 返回 False
-
-
成员运算符
in not in- 是否在序列中
in - 是否不在序列中
not in - 返回布尔值
- 是否在序列中
-
身份运算符
is is not- 判断两个标识符是否引自同一对象
- 判断两个标识符是否不引自同一对象
- 注意:
- 返回布尔值
- 类似获取对象内存地址函数:
id()
运算符优先级
| 运算符 | 描述 |
|---|---|
| ** | 指数 (最高优先级) |
| ~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
| * / % // | 乘,除,取模和取整除 |
| + - | 加法减法 |
| >> << | 右移,左移运算符 |
| & | 位 'AND' |
| ^ | | 位运算符 |
| <= < > >= | 比较运算符 |
| <> == != | 等于运算符 |
| = %= /= //= -= += *= **= | 赋值运算符 |
| is is not | 身份运算符 |
| in not in | 成员运算符 |
| not and or | 逻辑运算符 |
语句
分支 判断
对于一条或一段代码,只有在满足条件时才能执行,即分支-判断
python中用if-else和if-elif-else来完成,else可省略
实际上到了这里,写起python代码来,与其他语言的不同才体现出来,它以冒号和缩进来区分代码块,相较于用
{}来区分的方式,这种方式无论优劣与否,能让书写代码和阅读代码的人感到身心愉悦是一定的(黑客再也不用担心拿到的源码全是}了:D)
-
格式:
if 变量/常量/表达式: 语句1 子语句 语句2 语句3 -
说明:
if 变量/常量/表达式:部分为条件判断式,无论if后面是变量还是常量又或者是表达式,只要最后产生的值是非0或非假的,就执行其后一个缩进块内的语句
单分支
-
if单分支结构
-
示例:
eg_int_var = 0 if eg_int_var: print("hello") eg_int_var = 1 if eg_int_var: print("Hi") ==================Run===================== Hi
双分支
-
if-else双分支结构
-
示例:
eg_int_var = 0 if eg_int_var: print("yes") else: print("no") ==================Run===================== no
多分支
-
if-elif-else多分支结构
-
示例:
eg_lists = ['Benz', 'Yamaha', 'Kawasaki', 'seven'] for eg_list in eg_lists: if(eg_list == 'Yamaha'): print(eg_list + ' is in Japan') elif(eg_list == 'benz'): print(eg_list + ' is in Germany') else: print(eg_list + ' cannot find') ==================Run===================== Benz cannot find Yamaha is in Japan Kawasaki cannot find seven cannot find
循环
在python中只有for循环和while循环两种循环
- 循环控制语句
- break:执行到此处时,结束本轮循环并跳出整层循环
- continue:执行到此处时,结束本轮循环并开始下一轮循环
- pass:不执行任何操作,一般用来占位,使循环结构完整
for循环
-
格式:
for 临时变量名 in 序列 -
说明:
- 临时变量名不得与已有变量重名,for循环结束后自动销毁
- for循环可以遍历任何序列,序列可以是列表、元祖等,也可以是一个字符串
- 临时变量可以有多个,以逗号分隔
while循环
range()
else搭配
python中常会出现奇奇怪怪的语句,for-else和while-else就是其中一种
-
for-else:
-
示例:
eg_lists = ['Benz', 'Yamaha', 'Kawasaki', 'seven'] for eg_list in eg_lists: print(eg_list + ' have bought') else: print('All motor sell out') ==================Run===================== Benz have bought Yamaha have bought Kawasaki have bought seven have bought All motor sell out
-
-
while-else:
-
示例:
eg_var = 1 while(eg_var < 4): print(eg_var) eg_var += 1 else: print("eg_var >= 10") ==================Run===================== 1 2 3 eg_var >= 10 -
说明:else只有当while()括号内的值为0或为假时,即循环正常结束时才执行,若遇到break也不会执行
-
文中代码参考自Eric Matthes的《Python Crash Course》

浙公网安备 33010602011771号