Python基础(全)
碎碎念:发现越到后面越显得基础的重要了,比如说有时候发现跟同学问的列表有关的操作,定义列表
list1 =list[]删除元素list1.del()和list.remove()的区别竟然都不知道了。del是按照数组元素下标巧记l下标进行删除,remove是根据元素的值进行删除,真的是基础不牢地动山摇啊!最后再补充一些使用的Python的函数使用方法和小技巧吧。
Python中的输入和输出(※)
第一种输出方式:
1 | name = "老李" |
第二种输出方式:
1 | print(f'名字是{name},年龄是{age},性别是{gender}') |
输入方式:
1 | price = float(input("请输入苹果单价:")) |
判断语句和循环语句
if语句:
- 和java有比较大的区别,java在写if语句时候后面要跟上()括号
if语句是用来进行判断的,其使用格式如下:
1 | if 要判断的条件: |
注意点:
1 | # not:将右边表达式的逻辑结果取反,Ture变为False,False变为True |
if,elif语句:
使用格式如下:
1 | if xxx1: |
if的嵌套:
1 | ticket = 1 |
随机数的生成方式:(※)
- 第一步:导入随机数:
import random - 第二步:生成随机数:
computer = random.randint(0,2)
注意:randit(0,2) 生成的随机数为0,1,2三个
注意:range和字符串切片都是左闭右开区间,取左不取右
1 | import random #导入随机数 |
while循环
举例:(求1-100累加和)
1 | i = 0 |
for,else(※)
以前只听说过if,else,没想到还有for,else。所以是个注意点,要不然看不懂代码;
for后面跟else,else只有在循环正常结束时才会执行
1 | for i in '1234567': |
break和continue
break的作用:
- 立刻结束break所在的循环
continue的作用:
- 用来结束本次循环,紧接着执行下一次的循环
1 | for i in "1234567": |
for循环(嵌套)(range和切片※)
1 | for i in range(5): #外层循环 |
容器
容器包括:字符串、列表、元组、字典
字符串
类似于:data = ‘abcdefg’
下标和切片(注意和range一样左闭右开)※
1 | data = 'abcdefg' |
字符串的常见操作
查找元素下标:(index,find都是返回元素下标的函数)
- 字符串序列.find(子串, 开始位置下标, 结束位置下标)
- 字符串序列.index(子串, 开始位置下标, 结束位置下标)
修改–replace(),split()
- 字符串序列.replace(旧子串, 新子串, 替换次数)
- 字符串序列.split(分割字符, num)
1 | mystr = "hello world and itcast and itheima and Python" |
字符串另外的20多种操作这里就不一一介绍了;
列表(※)
列表操作之增删改查(curd)
添加元素:append, extend, insert
修改元素:修改元素的时候,要通过下标来确定要修改的是哪个元素,然后才能进行修改
查找元素: in, not in, index, count
>>> a = ['a', 'b', 'c', 'a', 'b'] >>> a.index('a', 1, 4) 3 >>> a.count('b') 21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- `删除元素: del, pop, remove`※
- del是按照下标进行删除
- remove是按照元素的值进行删除
```python
my_list = [1, 12, 3, ['老李','老张']] # 列表里面还可定义列表
print(my_list[3][1]) # '老李'
print(my_list[2]) # '3'
print(my_list.index(3, 0, 4)) # '2',查找元素3的下标,在0到4区间查找
print(my_list.count(1)) # 统计元素1出现的个数
my_list.append("张阿四") #append()在列表的末尾追加数据
print(my_list)
names = ["xiaofei","zhangsan"]
names.append(my_list)
print(names)
names.extend(my_list) # 通过extend可以将另一个集合中的元素逐一添加到列表中
print(names)
my_list.insert(1,"老六") # 在下标1位置插入元素
print(my_list)
# 修改元素
my_list[1] = 'xiaoLu'
# 查找元素
name_list = ['xiaoWang','xiaoZhang','xiaoHua']
find_name = input('请输入要查找的姓名:')
#查找是否存在
if find_name in name_list:
print('在列表中找到了相同的名字')
else:
print('没有找到')
列表和循环搭配容易踩的坑※
由于忽略列表遍历是按照下标进行遍历的:
1 | a = [1, 1, 3, 1, 1, 3, 2, 4] |
正确的方法:
1 | a = [1, 1, 3, 1, 1, 3, 2, 4] |
列表推导式
作用:用一个表达式创建一个有规律的列表或控制一个有规律列表。
列表推导式又叫列表生成式。
1 | a = [x for x in range(10) if x % 2 == 0] |
Python中的去重,排序,逆置元素,交换元素(※)
去重对比
1 | # 一般的去重方式 |
排序对比
1 | # 一般的冒泡排序 |
Python逆置元素
1 | # Python中的逆置 |
Python交换元素和其他语言交换元素(a, b = b, a 交换a,b的值)
其他语言:
1 | # 方法一(左差法) |
python:
1 | a = 100 |
元组
元组的特性
- 一个元组可以存储多个数据,元组内的数据是不能修改的
元组的操作(只有查index,+,count)
1 | tuple1 = ('af', 'dd', 'ee', 'dd') |
元组装包和拆包
元组装包: 个人理解,就是定义元组的时候,不用写小括号
元组拆包: 用字符接收元组的值时候,直接写a,b = tuple这种就是自动拆包
1 | # 自动装包 |
字典
字典存储的是键值对。
使用get获取字典中的元素※
get() 方法 和dict[key] 访问元素区别
get(key) 方法在 key(键)不在字典中时,可以返回默认值 None 或者设置的默认值。
dict[key] 在 key(键)不在字典中时,会触发 KeyError 异常
1 | info = {'name':'吴彦祖','age':18} |
直接通过键来查看值
1 | print(info['age']) # 获取年龄 |
字典操作之curd※
1 | my_dict = {'name':'小明', 'age':'18', 'gender':'男'} |
keys()
显示所有的key值
1 | dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'} |
values()
显示所有的value值
1 | dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'} |
items()
显示所有的键值对(key-value形式)
1 | dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'} |
集合
如何定义集合: 形如
my_set = {}和字典定义的符合相同,不过字典存储的是键值对集合的特性:
集合不能存储重复的元素
增(add函数)
1 | my_set.add(4)#{1, 2, 3, 4} |
删除(pop, remove函数)
1 | my_set.pop() #从头部删除 |
函数
- 函数有多个返回值的时候,会将返回值以元组的形式返回
1 | def func(): |
函数的参数
- 形参:函数定义时小括号中的参数,用来接收参数用的,称为 “形参”
- 实参:函数调用时小括号中的参数,用来传递给函数用的,称为 “实参”
参数的类型
- 位置参数: 根据函数定义的参数位置来传递参数
1 | def user_info(name, age, gender): |
- 关键字参数:函数调用,通过“键=值”形式加以指定。
1 | def usr_info(name, age, gender): |
- 缺省参数:在函数定义时为形参提供默认值
比如:
def usr_info(name, age='未知', gender='未知'):
- 不定长参数:不确定调用的时候会传递多少个参数
- 作用(参数传多了的问题)* args将多余的参数以元组的形式存储起来 ,**kwargs用于存储多余的键值对
1 | def usr_info(name, age, gender ,*args, **kwargs): |
函数作为参数※
函数作为一个参数,函数名存储的是函数内存空间的地址
下面这个例子:在函数调用时func==my_add
1 | # 函数作为一个参数,函数名存储的是函数内存空间的地址 |
匿名函数
使用lambda创建小型的函数,省去了用def创建函数的步骤
lambda函数也叫匿名函数
1 | func = lambda a, b : a - b #冒号后面的相当于是返回值 |
1 | def application(func): |
匿名函数和sort排序结合
1 | # 使用lambda表达式进行列表的排序 |
闭包※
闭包的构成条件
在函数嵌套(函数里面在定义函数)的前提下
内部函数使用了外部函数的变量(还包括外部函数的参数)
外部函数返回了内部函数
1 | def func_out(func): #第二步 |
装饰器※
装饰器的功能:就是给已有函数添加新的功能
- 不修改已有函数的1源代码
- 不修改已有函数的调用方式
- 给函数添加功能
装饰器是特殊的闭包
1 | def func_out(func): #第二步 |
文件操作※
普通文件操作
1 | f = open("./test.json", 'a', encoding="utf8") # 参数(路径和文件打开方式和解码方式) |
文件的复制(并重新命名)※
1 | # 需求:文件的写操作(需求,创建一个文件的复制文件并以-文件复制.json-重新命名) |
普通txt文件复制改进
了解改进的前提: 知道文件读取是放入到内存中的, 如果内存(缓冲区满了)文件还没有写入到磁盘中,就会导致内存溢出.所以要及时刷新缓冲区,及时写入到内存中.
- 改进的一点就是,如果文件太大,要用flush刷新缓冲区.
- 第二点是readline和readlines的区别,readline是一次读取一行,要把文件读取完需要结合while循环一起使用
- readlines是一次读取完文件,文件太大可能导致内存溢出
1 | # 文本文件的复制 |
非文本文件的复制(二进制)
和上面文本文件的复制大同小异,不过w要替换成wb,r要替换成rb(二进制文件)
1 | # 非文本文件的复制 |
关于JSON文件的操作※
json.load()和json.loads()的区别:
json.load()方法是从json文件读取json,而json.loads()方法是直接读取json,
两者都是将字符串json转换为字典。
1 | import json |
dump[dʌmp]倾倒; 抛弃; 转存
json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)。
json.dumps()函数是将一个Python数据类型列表(字典)进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)。
OS模块※
1 | import os |
文件名批量修改脚本※
1 | import os |
异常
捕获已知类型的异常
1 | try: |
捕获未知类型的异常(异常完整语法)※
try:(捕获异常)
except Exception as e:(异常处理)
else:(没有异常)
finally:(有没有异常都要执行)
1 | try: |
模块导入
制作模块
在文件夹中new - >Python package,命名为util包在__init__中写_all_=[‘py文件名’]表示对外公开的模块
1 | # 导入模块的方式 |
1 | # import 包名.模块名 |
小技巧(Tricks)
1 | 快速注释 ==> Ctrl+l |


