1.语法基础
1.1书写规范
Python最具特色的语法是以缩进的形式来表示代码块,不再需要使用{}。
Python 书写格式一般遵循 PEP 8 编码规范,主要包括以下几个方面:
1. 代码缩进
- 统一使用 4 个空格 进行缩进,不要使用 Tab。
def example_function():
for i in range(10):
print(i)
2. 变量命名
- 变量、函数名使用 小写字母+下划线(snake_case)
- 类名使用 首字母大写的驼峰命名(PascalCase)
- 常量使用 全大写字母+下划线(UPPER_CASE)
max_count = 100 # 变量
def get_user_info(): # 函数
pass
class StudentInfo: # 类名
pass
PI = 3.14159 # 常量
3. 空行规范
- 顶级定义(类、函数)之间 使用两个空行
- 方法、函数内部的逻辑分隔使用 单个空行
class MyClass:
def method_one(self):
pass
def method_two(self):
pass
def my_function():
print("Hello, World!")
4. 运算符空格
- 二元运算符(如
=, +, -, *, /, ==)两侧 各空 1 格 - 不要在参数列表或函数调用的
=两侧加空格
x = 10 + 5 # 正确
y = x * 2 # 正确
def func(arg1=10, arg2=20): # 正确
pass
5. 注释规范
- 行内注释:与代码间隔两个空格,
#后跟 1 个空格 - 块注释:使用
#号,每行前有 1 个空格 - 文档字符串(docstring):使用
""" """包裹
# 计算圆的面积
def calculate_area(radius):
"""计算并返回圆的面积"""
return 3.14 * radius ** 2 # 使用 π 计算面积
6. 导入模块
- 标准库、第三方库、自定义库,三类 分组导入
import语句 按字母顺序排列,且尽量 每个库占一行
import os
import sys
import numpy as np
import pandas as pd
from my_project import my_module
7. 行长度
- 单行最多 79 个字符
- 长行换行时,推荐使用 括号包裹,避免使用
\
data = (
"This is a very long string that "
"needs to be wrapped properly."
)
8. 函数与类
- 类的方法的第一个参数必须是
self - 类方法的第一个参数必须是
cls
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, year):
return cls(name, 2025 - year)
这些是 Python 代码书写的基本格式规范,遵循这些规则能让代码更清晰、更易读!🚀
1.2 语法特点
1. 注释规则
单行注释:以#开头,为了增加可读性建议在#后加一个空格,然后再写上相应的文字说明
# 这是一个单行注释
多行注释:三个单引号或者三个多引号将注释括起来
'''
单引号注释
单引号注释
'''
"""
这是一个使用三双引号的多行注释
同样可以用于详细说明代码的相关信息
"""
2. 语句换行
如果一个语句太长,全部写在一行不太美观可以使用 \ 来实现换行
x = "床前明月光,\
疑似地上霜,\
举头望明月,\
低头思故乡。"
被()、[ ]、{ }包括起来的语句不用使用 \ 可以直接分成多行。
print("这是一个",
"分行的"
"例子")
Python允许将多个语句写在同一行,语句之间用分号隔开。
a = 10;b=20;print(a+b)
# 同一行书写多个语句会使代码的可读性大大降低
3. 模块导入
模块分为内置模块和非内置模块,内置模块会在Python启动时自动导入。非内置模块需要手动导入。格式如下:
import 模块名
1.3 标准输入/输出
1. 标准输入
在 Python 中,使用 input() 函数进行标准输入,它会暂停程序的执行,等待用户从键盘输入内容,直到用户按下回车键。input() 函数会将用户输入的内容作为字符串返回。
基本用法
# 获取用户输入的姓名
name = input("Please enter your name: ")
print(f"Hello, {name}!")
处理不同类型的输入
由于 input() 函数返回的是字符串类型,如果需要处理其他类型的数据,如整数或浮点数,需要进行类型转换。
# 获取用户输入的整数
age_str = input("Please enter your age: ")
age = int(age_str) # 将字符串转换为整数
print(f"Next year, you will be {age + 1} years old.")
# 获取用户输入的浮点数
height_str = input("Please enter your height (in meters): ")
height = float(height_str) # 将字符串转换为浮点数
print(f"Your height in centimeters is {height * 100} cm.")
2. 标准输出
在 Python 中,使用 print() 函数进行标准输出,它可以将指定的内容打印到控制台。
基本用法
# 打印字符串
print("Hello, World!")
# 打印数字
print(123)
# 打印多个值,用逗号分隔,默认会用空格连接
print("The answer is", 42)
格式化输出
为了使输出更加美观和符合特定的格式要求,Python 提供了多种格式化输出的方法。
- 旧式字符串格式化(使用
%操作符)
name = "Alice"
age = 25
print("My name is %s and I am %d years old." % (name, age))
使用m.n的形式可以实现数据的宽度和精度设置 n在控制精度的同时会进行四舍五入
num = 13.231
print("设置宽度为10,精度为2的数据:%10.2f"%num)
#运行结果为:设置宽度为10,精度为2的数据: 13.23
- 新式字符串格式化(使用
str.format()方法)
name = "Bob"
age = 30
print("My name is {} and I am {} years old.".format(name, age))
- f - 字符串(Python 3.6 及以上版本支持)
name = "Charlie"
age = 35
print(f"My name is {name} and I am {age} years old.")
1.4 字面量
在编程中,字面量(Literal)是用于表达一个固定值的表示法,也就是在代码中直接给出的常量值。不同的数据类型有不同形式的字面量,下面为你详细介绍 Python 中常见的数据类型及其对应的字面量形式:
1. 数字字面量
- 整数(Integer):由数字组成,可正可负,没有小数点。例如:
# 正整数
positive_integer = 10
# 负整数
negative_integer = -20
- 浮点数(Float):表示带有小数部分的数字,使用小数点来分隔整数部分和小数部分。也可以使用科学计数法表示。例如:
# 普通浮点数
float_number = 3.14
# 科学计数法表示的浮点数
scientific_float = 1.23e-4 # 相当于 1.23 * 10^(-4)
- 复数(Complex):由实数部分和虚数部分组成,虚数部分以
j或J结尾。例如:
complex_number = 2 + 3j
2. 字符串字面量
字符串是由零个或多个字符组成的序列,可以使用单引号(')、双引号(")或三引号(''' 或 """)来表示。
# 单引号字符串
single_quoted_string = 'Hello, World!'
# 双引号字符串
double_quoted_string = "Python is great"
# 三引号字符串,常用于多行字符串
multi_line_string = '''This is a
multi-line
string.'''
3. 布尔字面量
布尔类型只有两个值:True 和 False,用于表示逻辑上的真和假。
is_valid = True
has_error = False
4. 空值字面量
在 Python 中,使用 None 来表示空值或缺失值,通常用于初始化变量或者表示函数没有返回值。
result = None
5. 列表字面量
列表是一种可变的有序序列,使用方括号([])来表示,元素之间用逗号分隔。
numbers = [1, 2, 3, 4, 5]
mixed_list = [1, 'apple', True]
6. 元组字面量
元组是一种不可变的有序序列,使用圆括号(())来表示,元素之间用逗号分隔。
point = (3, 4)
single_element_tuple = (1,) # 只有一个元素的元组需要在元素后面加逗号
7. 集合字面量
集合是一种无序且唯一的数据结构,使用花括号({})来表示,元素之间用逗号分隔。注意,空集合不能直接用 {} 表示,因为 {} 表示空字典,空集合需要使用 set() 来创建。
fruits = {'apple', 'banana', 'cherry'}
8. 字典字面量
字典是一种无序的键值对集合,使用花括号({})来表示,键和值之间用冒号(:)分隔,键值对之间用逗号分隔。
person = {'name': 'John', 'age': 30, 'city': 'New York'}
1.5 变量和常量
1. 变量
概念
变量是存储数据的容器,在程序运行过程中,变量的值可以被改变。你可以把变量想象成一个贴了标签的盒子,标签就是变量名,盒子里装的东西就是变量的值。
变量的命名规则
- 只能包含字母、数字和下划线:变量名可以由字母(大写或小写)、数字和下划线组成,但不能以数字开头。例如,
my_variable是合法的,而123variable是不合法的。 - 区分大小写:在 Python 中,大写字母和小写字母被视为不同的字符。例如,
myVar和myvar是两个不同的变量。 - 不能使用 Python 的关键字:Python 有一些具有特殊意义的关键字,如
if、else、for等,不能将这些关键字用作变量名。
变量的声明和赋值
在 Python 中,不需要提前声明变量的类型,当你给一个变量赋值时,Python 会自动根据值的类型来确定变量的类型。赋值使用等号(=),等号左边是变量名,右边是要赋给变量的值。
# 给变量赋值
name = "Alice" # 字符串类型
age = 25 # 整数类型
height = 1.65 # 浮点数类型
is_student = True # 布尔类型
变量值的修改
变量的值可以在程序的不同地方被修改,通过再次赋值即可。
x = 10
print(x) # 输出: 10
x = 20
print(x) # 输出: 20
2. 常量
概念
常量是一种特殊的变量,其值在程序运行过程中不应该被改变。不过,Python 并没有内置的常量类型,通常使用命名约定来表示常量。
常量的命名约定
在 Python 中,通常将常量名全部使用大写字母,单词之间用下划线分隔。虽然这种命名方式并不能真正限制常量的值不被修改,但它是一种约定俗成的规范,提醒开发者不要去修改这个变量的值。
# 定义常量
PI = 3.14159
MAX_USERS = 100
常量值的不可修改性
虽然 Python 没有强制限制常量的值不能被修改,但按照编程规范,不应该对常量进行重新赋值。如果不小心修改了常量的值,可能会导致程序出现难以调试的问题。
PI = 3.14159
# 不建议这样做,但 Python 不会阻止
PI = 3.2
print(PI) # 输出: 3.2
总结来说,变量是用于存储可以变化的数据,而常量是用于存储不应该被改变的数据,在 Python 中通过命名约定来区分它们。合理使用变量和常量可以让代码更加清晰和易于维护。
1.6 数据类型
1. 数据类型
1. 数值类型
- 整数(
int):表示整数,可正可负,没有小数部分。
num = 10
print(type(num)) # <class 'int'>
- 浮点数(
float):表示带有小数部分的数字。
f_num = 3.14
print(type(f_num)) # <class 'float'>
- 复数(
complex):由实部和虚部组成,虚部用j或J表示。
c_num = 2 + 3j
print(type(c_num)) # <class 'complex'>
2. 序列类型
- 字符串(
str):表示文本,用单引号、双引号或三引号(多行)括起来。
s = "Hello, World!"
print(type(s)) # <class 'str'>
- 列表(
list):可变的、有序的序列,可包含不同类型的元素。
lst = [1, 2, 'a']
print(type(lst)) # <class 'list'>
- 元组(
tuple):不可变的、有序的序列,可包含不同类型的元素。
tup = (1, 2, 'a')
print(type(tup)) # <class 'tuple'>
3. 映射类型
- 字典(
dict):无序的键值对集合,键必须是不可变类型,值可以是任意类型。
dic = {'name': 'Alice', 'age': 20}
print(type(dic)) # <class 'dict'>
4. 集合类型
- 集合(
set):无序的、唯一元素的集合。
s1 = {1, 2, 3}
print(type(s1)) # <class 'set'>
- 冻结集合(
frozenset):不可变的集合。
fs = frozenset([1, 2, 3])
print(type(fs)) # <class 'frozenset'>
5. 布尔类型(bool)
表示真(True)或假(False)。
b = True
print(type(b)) # <class 'bool'>
6. (补)字符串的操作方法
1. 索引操作
字符串是一个有序的字符序列,可以通过索引来访问单个字符。在 Python 中,索引从 0 开始,也可以使用负数索引,负数索引从 -1 开始,表示从字符串的末尾开始计数。
s = "Hello, World!"
# 正向索引
print(s[0]) # 输出 'H'
print(s[7]) # 输出 'W'
# 负向索引
print(s[-1]) # 输出 '!'
print(s[-6]) # 输出 'W'
2. 连接操作
可以使用 + 运算符将两个或多个字符串连接成一个新的字符串。
s1 = "Hello"
s2 = " World!"
s3 = s1 + s2
print(s3) # 输出 'Hello World!'
3. 复制操作
使用 * 运算符可以将字符串复制指定的次数。
s = "abc"
s_repeated = s * 3
print(s_repeated) # 输出 'abcabcabc'
4. 切片操作
切片操作允许从字符串中提取子字符串。语法为 [start:stop:step],其中 start 是起始索引(包含),stop 是结束索引(不包含),step 是步长(可选,默认为 1)。
s = "Hello, World!"
# 提取从索引 0 到索引 4 的子字符串
print(s[0:5]) # 输出 'Hello'
# 省略 start,默认从 0 开始
print(s[:5]) # 输出 'Hello'
# 省略 stop,默认到字符串末尾
print(s[7:]) # 输出 'World!'
# 使用负索引
print(s[-6:-1]) # 输出 'World'
# 使用步长
print(s[::2]) # 输出 'Hlo ol!'
5. 常用方法
查找和替换
find(sub[, start[, end]]):返回子字符串sub在字符串中第一次出现的索引,如果未找到则返回 -1。
s = "hello world"
print(s.find("world")) # 输出: 6
rfind(sub[, start[, end]]):返回子字符串sub在字符串中最后一次出现的索引,如果未找到则返回 -1。
s = "hello world, world"
print(s.rfind("world")) # 输出: 13
index(sub[, start[, end]]):与find()方法类似,但如果未找到子字符串会抛出ValueError异常。
s = "hello world"
try:
print(s.index("world")) # 输出: 6
except ValueError:
print("Substring not found")
rindex(sub[, start[, end]]):与rfind()方法类似,但如果未找到子字符串会抛出ValueError异常。
s = "hello world, world"
try:
print(s.rindex("world")) # 输出: 13
except ValueError:
print("Substring not found")
replace(old, new[, count]):将字符串中的所有old子字符串替换为new子字符串,count参数指定替换的次数。
s = "hello world"
print(s.replace("world", "python")) # 输出: hello python
大小写转换
upper():将字符串中的所有小写字母转换为大写字母。
s = "hello"
s_upper = s.upper()
print(s_upper) # 输出 'HELLO'
lower():将字符串中的所有大写字母转换为小写字母。
s = "HELLO"
s_lower = s.lower()
print(s_lower) # 输出 'hello'
title():将字符串中每个单词的首字母转换为大写,其余字母转换为小写。
s = "hello world"
s_title = s.title()
print(s_title) # 输出 'Hello World'
s.capitalize():仅首字母大写,其余小写s.swapcase():大小写互换
去除空白字符
strip([chars]):返回一个新字符串,去除字符串开头和结尾的指定字符(默认为空白字符)。
s = " hello "
s_stripped = s.strip()
print(s_stripped) # 输出 'hello'
lstrip([chars]):去除字符串开头的指定字符。rstrip([chars]):去除字符串结尾的指定字符。
分割和连接
split(sep=None, maxsplit=-1):根据指定的分隔符sep将字符串分割成一个列表,maxsplit参数指定最大分割次数。
s = "hello,world,python"
print(s.split(",")) # 输出: ['hello', 'world', 'python']
split() 方法若不传入参数,默认会以任意空白字符(像空格、制表符、换行符等)作为分隔符来分割字符串,并且会把结果里的空字符串去除。
rsplit(sep=None, maxsplit=-1):与split()方法类似,但从字符串的右侧开始分割。
s = "hello,world,python"
print(s.rsplit(",", 1)) # 输出: ['hello,world', 'python']
splitlines([keepends]):根据换行符将字符串分割成一个列表,keepends参数指定是否保留换行符。
s = "hello\nworld\npython"
print(s.splitlines()) # 输出: ['hello', 'world', 'python']
join(iterable):将可迭代对象中的字符串元素连接成一个字符串,使用调用该方法的字符串作为分隔符。
words = ["hello", "world", "python"]
print(", ".join(words)) # 输出: hello, world, python
判断字符串特征
startswith(prefix[, start[, end]]):判断字符串是否以指定前缀prefix开头。
s = "Hello, World!"
print(s.startswith("Hello")) # 输出 True
endswith(suffix[, start[, end]]):判断字符串是否以指定后缀suffix结尾。
s = "Hello, World!"
print(s.endswith("World!")) # 输出 True
isalpha():判断字符串是否只包含字母。
s = "Hello"
print(s.isalpha()) # 输出 True
isdigit():判断字符串是否只包含数字。
s = "123"
print(s.isdigit()) # 输出 True
isalnum():判断字符串是否只包含字母和数字。
s = "hello123"
print(s.isalnum()) # 输出: True
isspace():判断字符串是否只包含空白字符。
s = " "
print(s.isspace()) # 输出: True
count(sub[, start[, end]]):统计sub出现次数
center(width, fillchar):将字符串居中显示,并使用指定的填充字符填充剩余的位置。
ljust(width, fillchar):将字符串左对齐,并使用指定的填充字符填充剩余的位置。
rjust(width, fillchar):将字符串右对齐,并使用指定的填充字符填充剩余的位置。
zfill(width) :将字符串右对齐,并用零填充到指定的宽度。
2. 数据类型转换
1. 数值类型转换
int():将其他数据类型转换为整数。
# 浮点数转整数,直接截断小数部分
num1 = int(3.14)
print(num1) # 3
# 字符串转整数,字符串必须是合法的整数表示
num2 = int('10')
print(num2) # 10
float():将其他数据类型转换为浮点数。
# 整数转浮点数
f1 = float(10)
print(f1) # 10.0
# 字符串转浮点数,字符串必须是合法的数字表示
f2 = float('3.14')
print(f2) # 3.14
2. 序列类型转换
str():将其他数据类型转换为字符串。
s1 = str(10)
print(s1) # '10'
s2 = str([1, 2, 3])
print(s2) # '[1, 2, 3]'
list():将其他可迭代对象转换为列表。
lst1 = list('abc')
print(lst1) # ['a', 'b', 'c']
lst2 = list((1, 2, 3))
print(lst2) # [1, 2, 3]
tuple():将其他可迭代对象转换为元组。
tup1 = tuple([1, 2, 3])
print(tup1) # (1, 2, 3)
tup2 = tuple('abc')
print(tup2) # ('a', 'b', 'c')
3. 集合类型转换
set():将其他可迭代对象转换为集合。
s1 = set([1, 2, 2, 3])
print(s1) # {1, 2, 3}
s2 = set('abc')
print(s2) # {'a', 'b', 'c'}
frozenset():将其他可迭代对象转换为冻结集合。
fs = frozenset([1, 2, 3])
print(fs) # frozenset({1, 2, 3})
4. 布尔类型转换
bool():将其他数据类型转换为布尔值。
# 以下值转换为布尔值为False
print(bool(0)) # False
print(bool(0.0)) # False
print(bool('')) # False
print(bool([])) # False
print(bool(())) # False
print(bool({})) # False
print(bool(None)) # False
# 其他值转换为布尔值为True
print(bool(1)) # True
print(bool('a')) # True
print(bool([1])) # True
5. 字典转换
字典没有直接的内置转换函数,但可以通过 dict() 函数结合可迭代对象(如包含键值对元组的列表)来创建字典。
# 从包含键值对元组的列表创建字典
dic = dict([('name', 'Alice'), ('age', 20)])
print(dic) # {'name': 'Alice', 'age': 20}
1.7 运算符与表达式
1. 算术运算符
| 运算符 | 描述 | 示例 (a = 10, b = 3) |
结果 |
|---|---|---|---|
+ |
加法 | a + b |
13 |
- |
减法 | a - b |
7 |
* |
乘法 | a * b |
30 |
/ |
除法(浮点) | a / b |
3.3333 |
// |
整除(返回商的整数部分) | a // b |
3 |
% |
取模 | a % b |
1 |
** |
幂运算(a的b次幂) | a ** b |
1000 |
2. 赋值运算符
| 运算符 | 示例 | 等价于 | 结果 (x = 5) |
|---|---|---|---|
= |
x = 5 |
x = 5 |
5 |
+= |
x += 2 |
x = x + 2 |
7 |
-= |
x -= 1 |
x = x - 1 |
6 |
*= |
x *= 3 |
x = x * 3 |
18 |
/= |
x /= 2 |
x = x / 2 |
9.0 |
//= |
x //= 2 |
x = x // 2 |
4 |
%= |
x %= 2 |
x = x % 2 |
0 |
**= |
x **= 2 |
x = x ** 2 |
16 |
3. 比较运算符
| 运算符 | 描述 | 示例 (a = 5, b = 3) |
结果 |
|---|---|---|---|
== |
等于 | a == b |
False |
!= |
不等于 | a != b |
True |
> |
大于 | a > b |
True |
< |
小于 | a < b |
False |
>= |
大于等于 | a >= b |
True |
<= |
小于等于 | a <= b |
False |
4. 逻辑运算符
| 运算符 | 描述 | 示例 (x = True, y = False) |
结果 |
|---|---|---|---|
and |
逻辑与 | x and y |
False |
or |
逻辑或 | x or y |
True |
not |
逻辑非 | not x |
False |
5. 位运算符
| 运算符 | 描述 | 示例 (a = 5, b = 3) |
结果 |
|---|---|---|---|
& |
按位与 | a & b |
1 |
| |
按位或 | `a | |
^ |
按位异或 | a ^ b |
6 |
~ |
按位取反 | ~a |
-6 |
<< |
左移位 | a << 1 |
10 |
>> |
右移位 | a >> 1 |
2 |
6. 成员运算符
| 运算符 | 描述 | 示例 (lst = [1, 2, 3]) |
结果 |
|---|---|---|---|
in |
是否存在 | 2 in lst |
True |
not in |
是否不存在 | 4 not in lst |
True |
7. 身份运算符
| 运算符 | 描述 | 示例 (a = [1, 2], b = a, c = [1, 2]) |
结果 |
|---|---|---|---|
is |
是否是同一对象 | a is b |
True |
is not |
是否不是同一对象 | a is not c |
True |
8. 运算符优先级(从高到低)
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 1 | ** |
幂运算 |
| 2 | ~ + - |
按位取反, 正负号 |
| 3 | * / // % |
乘, 除, 整除, 取模 |
| 4 | + - |
加, 减 |
| 5 | >> << |
位移运算 |
| 6 | & |
按位与 |
| 7 | ^ | |
|
| 8 | == != > < >= <= |
比较运算 |
| 9 | not and or |
逻辑运算 |
| 10 | is in |
身份和成员运算 |
发表评论