Python语言,总给我一种“嗯?还能这么玩儿?”的感觉
Python像一个二三十岁的年轻人,自由、年轻、又灵活
欢迎一起进入Python的世界~
本人工作中经常使用Python,针对一些常用的语法概念进行持续记录。
一、类与常见数据结构
1. Python库、模块、类
Python库是一个集合,包含多个模块。模块是单个文件,包含函数、类和变量等。类是模块中的一个组件,用于定义对象的结构和行为。简而言之,库由模块组成,模块由类和其他代码组成。
1) Python库
- Python库是一组模块的集合,通常是为了实现特定的功能或解决特定的问题而组织在一起的。库可以是一个包(Package),包是一种特殊的模块,可以包含多个子模块和子包。
- 库用于提供一组相关的功能,这些功能通常比单个模块更复杂、更全面。库可以是第三方库,也可以是Python标准库的一部分。
2) Python模块
在了解Python类与基本数据结构之前,需要了解Python类到底在该语言中处于怎样的位置,即Python类与具体的Python文件之间是什么关系。
Python文件和类的关系:Python文件和类的关系可以类比为容器和内容物的关系。一个Python文件可以包含一个或多个类的定义,也可以包含其他代码,如函数、变量等。
- 一个Python文件称为一个模块。模块是Python代码的基本组织单位。(模块的名称通常与文件名相同。例如,文件
my_module.py
定义了一个模块my_module
) - 在模块中可以定义类:这些类可以相互独立,也可以相互关联。
- 导入模块和类:可以使用import导入整个模块,然后通过模块名访问其中的类、函数和变量。同样,也可以使用 from ... import ... 语句直接导入模块中的指定类。
3) Python类
使用class关键词来定义一个类:
python">class MyClass:# 类的属性attribute1 = "value1"attribute2 = "value2"# 类的方法def my_method(self):print("Hello from my_method!")
创建实例,通过类名后跟一对括号创建实例:
python">my_instance = MyClass()
print(my_instance.attribute1) # 输出: value1
my_instance.my_method() # 输出: Hello from my_method!
初始化方法:
__init__方法是一个特殊的方法,被成为类的构造函数或初始化方法。当创建一个新的对象实例时,__init__方法会被自动调用。
2. Python基本数据结构
Python提供了几种内置的基本数据结构,这些数据结构在日常编程中非常有用。以下是一些常见的Python基本数据结构及其详细说明:
1) 列表(List)
列表是一种有序的集合,可以包含不同类型的元素。列表是可变的,这意味着你可以修改列表中的元素。
以下代码包含了 创建列表、插入元素和删除元素 的逻辑:
python"># 1. 创建列表:
my_list = [1, 2, 3, 4, 5]
my_list = ['apple', 'banana', 'cherry']
my_list = [1, 'apple', 3.14, True]# 2. 插入元素:
my_list = [1, 2, 3]# 在列表末尾插入一个元素
my_list.append(4) # [1, 2, 3, 4]# 在列表指定位置插入一个元素
my_list.insert(1, 'a') # [1, 'a', 2, 3, 4]# 在列表末尾一次性添加多个元素
my_list.extend([5, 6]) # [1, 'a', 2, 3, 4, 5, 6]# 3. 删除元素:
my_list = [1, 'a', 2, 3, 4, 5, 6]# 删除第一个值为 x 的元素
my_list.remove('a') # [1, 2, 3, 4, 5, 6]# 删除指定位置的元素,并返回该元素。如果不指定位置,默认删除最后一个元素
my_list.pop(2) # [1, 2, 4, 5, 6],返回3# 删除最后一个位置的元素
my_list.pop() # [1, 2, 4, 5],返回6# 清空列表
my_list.clear() # []
常用方法:
- 添加元素:
- append(x) :在列表末尾添加一个元素
- insert(i, x) : 在指定位置插入一个元素
- extent(iterable):在列表末尾一次性添加多个元素
当需要处理一个动态的数据集合,列表是一个很好的选择。
2) 元组(Tuple)
元组是一种有序的集合,与列表类似,但元组是不可变的,这意味着一旦创建,就不能修改元组中的元素。
python"># 创建元组
my_tuple = (1, 2, 3, 4, 5)
my_tuple = ('apple', 'banana', 'cherry')
my_tuple = (1, 'apple', 3.14, True)# 1. 访问元组,可以通过索引进行访问
my_tuple = (1, 2, 3, 4, 5)
print(my_tuple[2]) # 3# 2. 其他方法
my_tuple = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)
my_tuple.count(5) # 3 返回值为5的元素个数
my_tuple.index(4) # 2 返回第一个值为x的元素的索引
元组相对于列表,其优势在于 不可变性。由于一经创建就不可变,一方面,可以存储固定的数据,例如存储不可修改的数据、或者作为字典的键。另一方面,由于其不可变,内存占用紧凑,更加节省内存空间。
3) 字典(Dictionary)
字典是一种无序的键值对集合。字典是可以变的,可以通过键来访问、添加、删除和修改值。
python"># 1. 创建字典
my_dict = {'name': 'Alice', 'age': 30, 'city': 'New York'}
print(my_dict['name']) # Alice# 2. 访问元素
my_dict = {'name': 'Alice', 'age': 30, 'city': 'New York'}
print(my_dict['name']) # Alice# 3. 添加和修改元素
my_dict['gender'] = 'Female' # 添加新键值对
my_dict['age'] = 31 # 修改现有键值对# 4. 删除元素
my_dict = {'name': 'Alice', 'age': 30, 'city': 'New York'}
# 删除指定键值对
del my_dict['city'] # {'name': 'Alice', 'age': 30}
# 删除指定键值对,并返回值。如果键不存在,返回默认值。
my_dict.pop('age') # 30,{'name': 'Alice'}
# 删除并返回最后一对键值对(Python 3.7+)。
my_dict.popitem() # ('name', 'Alice'),{}
# 清空字典。
my_dict.clear() # {}# 5. 其他方法
# 返回字典的键视图
print(my_dict.keys()) # dict_keys(['name', 'age', 'city'])
# 返回字典的值视图。
print(my_dict.values()) # dict_values(['Alice', 30, 'New York'])
# 返回字典的键值对视图。
print(my_dict.items()) # dict_items([('name', 'Alice'), ('age', 30), ('city', 'New York')])
# 返回指定键的值,如果键不存在,返回默认值。
print(my_dict.get('name')) # Alice
print(my_dict.get('gender', 'Unknown')) # Unknown
4) 集合(Set)
集合是一种无序的不重复元素集合。集合是可变的,可以进行集合运算,如并集、交集、差集等。
python"># 1. 创建集合
my_set = {1, 2, 3, 4, 5}
my_set = set([1, 2, 3, 4, 5])# 2. 添加元素
my_set = {1, 2, 3}
# 添加一个元素
my_set.add(4) # {1, 2, 3, 4}
# 添加多个元素
my_set.update([5, 6]) # {1, 2, 3, 4, 5, 6}# 3. 删除元素
my_set = {1, 2, 3, 4, 5}
# 删除元素x,如果元素不存在,抛出KeyError。
my_set.remove(3) # {1, 2, 4, 5}
# 删除元素x,如果元素不存在,不抛出异常。
my_set.discard(6) # {1, 2, 4, 5}
# 删除并返回一个任意元素,如果集合为空,抛出KeyError。
my_set.pop() # 返回一个任意元素,例如1,{2, 4, 5}
# 清空集合。
my_set.clear() # {}# 4. 集合运算
# union(*others):返回并集。
# intersection(*others):返回交集。
# difference(*others):返回差集。
# symmetric_difference(other):返回对称差集。
# issubset(other):判断是否是子集。
二、Python进行HTTP请求
1. 示例代码
Python进行HTTP请求,通常使用 requests库
下面是一个经典的,使用requests请求并返回数据的Python代码:
python">import requests
import jsonapi_key = 'xxx'# 设置params(如果有的话)
params = {'key1': 'value1','key2': 'value2'
}# 设置请求头
headers = {'Authorization': f'Bearer {api_key}','Content-Type' : 'application/json'
}# 设置payload数据
data = {"inputs": {"title" : "托尼老师,你睡了吗?我睡不着"},"query": "1","response_mode": "streaming","conversation_id": "","user": "xxx"
}# 发送请求
# data从json变成json字符串格式
response = requests.post('https://xxx/v1/chat-messages', headers=headers, params=params, data=json.dumps(data))# 输出返回值
print(response.text)
最后返回的response对象是一个requests.Response对象,它包含了服务器返回的所有信息。虽然它是一个Python对象,但是并不是一个简单的数据结构,而是封装了多种属性和方法的复杂对象。可以通过访问它的属性和调用它的方法来获取和处理响应内容。
-
response.status_code
:返回HTTP状态码,例如200表示成功,404表示未找到等。 -
response.headers
:返回一个字典,包含响应头信息。 -
response.cookies
:返回一个RequestsCookieJar
对象,包含响应中的cookies。 -
response.url
:返回请求的URL,包括查询字符串。 -
response.encoding
:返回响应内容的编码。 -
response.text
:返回响应内容的字符串形式,自动根据响应的编码进行解码。 -
response.content
:返回响应内容的字节形式,适用于二进制数据,如图片、文件等。 -
response.json()
:将响应内容解析为JSON对象,前提是响应内容是JSON格式。
这里简单了解下就好,使用debug模式可以直接看到具体返回情况。
2. JSON数据处理
函数 | 描述 |
---|---|
json.dumps | 将 Python 对象编码成 JSON 字符串 |
json.loads | 将已编码的 JSON 字符串解码为 Python 对象 |
1) json.dumps
json.dumps用于将Python对象编码成JSON字符串
语法:
python">json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
实例:
以下实例将数组编码为JSON格式数据:
python">#!/usr/bin/python
import jsondata = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]data2 = json.dumps(data)
print(data2)
以上代码执行结果为:
python">[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]
使用参数让JSON数据格式化输出:
python">#!/usr/bin/python
import jsondata = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ]data2 = json.dumps({'a': 'Runoob', 'b': 7}, sort_keys=True, indent=4, separators=(',', ': '))
print(data2)
以上代码执行结果为:
python">{"a": "Runoob","b": 7
}
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
2) json.loads
json.loads用于解码JSON数据。该函数返回Python字段的数据类型。
语法:
python">json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
实例:
以下实例展示了Python 如何解码 JSON 对象:
python">#!/usr/bin/python
import jsonjsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}';text = json.loads(jsonData)
print(text)
以上代码执行结果为:
python">{u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
三、Python文件处理
1. 文件目录:os模块
我们都知道,os中文是操作系统的意思,顾名思义,Python 的 os 模块提供了各种操作系统的接口,这些接口主要是用来操作文件和目录。
Python中所有依赖于操作系统的内置模块,对于不同系统提供了相同接口,大大提升其可移植性。
查看路径,代码示例:
python">import os# 1. 查看路径
# 查看当前路径
print(os.getcwd())# 返回指定目录下包含的文件和目录名列表。
print(os.listdir('E:/'))# 返回路径 path 的绝对路径。
print(os.path.abspath('.'))# 将路径 path 拆分为目录和文件两部分,返回结果为元组类型。
print(os.path.split('E:/tmp.txt'))# 将一个或多个 path(文件或目录) 进行拼接。
print(os.path.join('E:/', 'tmp.txt'))# 2. 查看 path 时间相关参数(path可以是文件、可以是路径)
# 返回 path 在系统中的创建时间。
print(datetime.datetime.utcfromtimestamp(os.path.getctime('E:/tmp.txt')))# 返回 path 的最后修改时间。
print(datetime.datetime.utcfromtimestamp(os.path.getmtime('E:/tmp.txt')))# 返回 path 的最后访问时间。
print(datetime.datetime.utcfromtimestamp(os.path.getatime('E:/tmp.txt')))# 3. 判断 path 存在性、确认文件大小
# 判断是否存在
print(os.path.exists('E:/tmp.txt'))# 判断是否为目录
print(os.path.isdir('E:/'))# 判断是否为文件
print(os.path.isfile('E:/tmp.txt'))# 返回 path 的大小,以字节为单位,若 path 是目录则返回 0。
print(os.path.getsize('E:/tmp.txt'))
print(os.path.getsize('E:/work'))# 4. 创建、更改功能
# 创建一个目录
os.mkdir('E:/test')# 创建多级目录
os.makedirs('E:/test1/test2')# 将当前工作目录更改为 path。
print(os.getcwd())
os.chdir('/test')
print(os.getcwd())# 5. 调用shell脚本
print(os.system('ping www.baidu.com'))
2. 读取与写入:open函数
open 函数是Python内置的函数,对文本文件和二进制文件采用同样的操作步骤,和把大象放冰箱里一样分三步:打开-操作-关闭。
在Python中,使用 open() 函数来打开文件。这个函数需要两个参数:文件名和打开模式。文件名可以是相对路径或绝对路径,打开模式决定了文件的打开方式,如读取、写入等。
常见的打开模式mode:
- 'r':读取模式,默认值。如果文件不存在,会抛出
FileNotFoundError
。 - 'w':覆盖写入模式。如果文件已经存在,会被覆盖。
- 'a':追加写入模式。如果文件已存在,写入的数据会被追加到文件末尾。
读取文件代码:
python"># 1. 读取文件
# 逐行读取文件的内容
# for循环配合文件对象迭代器
with open('example.txt', 'r') as file_object:for line in file_object:print(line.strip()) # 使用strip()去除行尾的换行符# 读取全部内容
# 使用read方法可以一次性读取文件的全部内容,并将其作为一个字符串返回
with open('example.txt', 'r') as file_object:content = file_object.read()print(content)# 按行读取到列表
# 使用readlines方法可以读取文件的全部行,并将其作为一个列表返回
with open('example.txt', 'r') as file_object:lines = file_object.readlines()for line in lines:print(line.strip())
写入文件:
python"># 2. 写入文件
# 覆盖写入:'w'模式打开文件,然后使用write()方法写入内容。
with open('output.txt', 'w') as file_object:file_object.write('Hello, world!\n')file_object.write('This is a test.\n')# 追加写入:'a'模式打开文件,然后使用write()方法写入内容。
with open('output.txt', 'a') as file_object:file_object.write('This is appended text.\n')
使用with语句可以自动关闭文件,但在不使用with语句的情况下,需要手动的关闭文件,以释放系统资源。可以使用close方法关闭文件。
实际开发中,推荐实用 with 语句来处理文件,因为它可以自动管理文件的打开和关闭,使代码更加简洁和安全。
注意,上面只给出了 'w' 和 'r' 两种模式,还有一些其他打开模式可供选择,例如:
-
'x'
:独占创建模式。如果文件已存在,会抛出FileExistsError
;如果文件不存在,会创建一个新文件。 -
't'
:文本模式,默认值。以文本形式处理文件,读取时会自动将内容解码为字符串,写入时会自动将字符串编码为字节。 -
'b'
:二进制模式。以二进制形式处理文件,读取和写入的内容都是字节序列。 -
'+'
:更新模式。用于读写文件,可以和r
、w
、a
等模式组合使用。
3. 处理Excel:openpyxl库
openpyxl
是一个Python库,用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件。它提供了丰富的功能,可以创建、修改和查询Excel文件中的数据,支持复杂的Excel操作,如处理公式、图表和样式等。
一个Excel电子文档中可以包含多个表,每个表里面有行、列、单元格
用户正在查看的当前表(或者关闭Excel前最后查看到表)称为活动表
使用 openpyxl 库操作Excel表,主要包括读取某个单元格、按照范围读取、按照行或列读取等。代码如下:
python">import openpyxl# 加载工作簿
workbook = openpyxl.load_workbook('example.xlsx')
# 获取工作表
sheet = workbook['Sheet1']# 1. 读取单元格A1的值
cell_value = sheet['A1'].value
print(cell_value) # 输出: 单元格A1的值# 2. 通过行和列索引读取数据
cell_value = sheet.cell(row=2, column=3).value
print(cell_value) # 输出: 单元格C2的值# 3. 读取A1:C3区域的值
cells = sheet['A1:C3']
for row in cells:for cell in row:print(cell.value, end=" ")print()# 4. 按行获取值
for row in sheet.iter_rows(min_row=1, max_row=5, min_col=1, max_col=3):for cell in row:print(cell.value, end=" ")print()# 5. 按列获取值
for col in sheet.iter_cols(min_row=1, max_row=5, min_col=1, max_col=3):for cell in col:print(cell.value, end=" ")print()
持续加载 ing ~