一. 注释
1. 什么是注释
注释就是对代码的解释说明。
注释是给程序员看的,在代码执行的时候不起任何作用,不影响程序的结构。
2. 注释的作用
- 提高代码的可读性。
- 屏蔽掉暂时不需要的代码
- 可以定位程序中出错的位置(通过注释可能出错的代码,来判断是否是被注释代码引发的错误)
3. 单行注释(行注释)
Python中 # 后的一行内的内容会被视为注释
# print("hello world")
print("hello world") # 打印hello world
注: 为了保持注释的整洁,Python官方建议在#和注释的内容之间加一个空格,在语句和#之间加两个空格。
4. 多行注释(块注释)
Python中使用三个引号开始,三个引号结束(单引号或者双引号都可以),为多行注释。
多行注释在说明文字需要换行时使用,不能嵌套。
"""
Hello World
hello world
"""
# 这种写法,实际上它是一个多行字符串
print(
"""
Hello World
hello world
"""
)
二. 变量
1. 什么是变量
变量 = 程序里用来存放数据的 “盒子 / 标签”,在内存的数据区中,会为变量分配存储空间来存放变量的值,这个内存空间的地址对应着变量名称。在程序中可以通过变量名称来区分和使用这些内存空间。
2. 变量的创建
变量创建方式:变量名 = 变量值
Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
变量三要素(必须记住)
- 变量名:给盒子起名字(如
name、score) - 赋值符号
=:把数据放进盒子 - 数据 / 值:盒子里装的内容(数字、字符串…)
var1 = 2 # 定义一个变量,变量名为var1,变量值为2
var2 = 3 # 定义一个变量,变量名为var2,变量值为3
result = var1 + var2 # 定义一个变量,变量名为result,变量值为var1和var2相加的结果
print(result) # 打印result变量的值
name = "张三"
age = 18
weight = 1000.3
# 多个变量的创建:
var1 = var2 = var3 = 10 # 多个变量的值相同
var4, var5, var6 = 10, 20, 30 # 多个变量的值不同
3. 标识符命名规则
1)标识符
程序中可以自己命名的地方
2)命名规则
- 只能包含字母、数字和下划线,且不能以数字开头。
- 区分大小写,即Name和name是两个不同的标识符。
- 不要和关键字重复。
- 应既简短又具有描述性。
- 注意:Python源文件不遵循命名规范不影响程序的执行,但不建议
3)关键字
Python 有一组关键字,这些关键字不能用作变量名、函数名或任何其他标识符。
keyword.kwlist可以输出当前版本的所有关键字:
4)标识符命名方法
常见的命名方法有三种:
- 驼峰命名法(upper camel case):每个单词首字母大写,例如UpperCamelCase。
- 小驼峰命名法(lower camel case):第一个单词首字母小写, 之后每个单词首字母大写,例如lowerCamelCase。
- 蛇形命名法(snake case):单词间用下划线连接,例如snake_case。
一句话总结:大驼峰只用于类名,蛇形命名90% 的场景都用。
4. 变量的修改
在程序中可随时修改变量的值,而Python将始终记录变量的最新值。
message = "hello world"
print(message)
message = "hello world hello world"
print(message)
# Python还支持方便的对变量相互替换
var1 = 2
var2 = 20
print(var1, var2) # 2 20
var1, var2 = var2, var1
print(var1, var2) # 20 2
5. 常量
在程序中定义后就不再修改的值为常量,Python中没有内置的常量类型。一般约定使用全大写变量名来表示常量。
PI = 3.1415926
E = 2.718282
三. 数据类型
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。Python 3中常见的数据类型分类如下:
1) 基本数据类型
- 数字类型
- int(整数):
100,-5 - float(浮点数):
3.14,0.5 - complex(复数):
1+2j - bool(布尔):
True/False
- int(整数):
- 字符串
- str:
"hello",'Python'
- str:
- 空类型
- NoneType:
None
- NoneType:
2) 容器数据类型
- 列表 list:
[1,2,3] - 元组 tuple:
(1,2,3) - 字符串 str:
"abc" - 集合 set:
{1,2,3} - 字典 dict:
{"name":"小明", "age":18}
3) 不可变数据(3 个): Number(数字)、String(字符串)、Tuple(元组)。
4) 可变数据(3 个): List(列表)、Dictionary(字典)、Set(集合)
1. int整型
Python可以处理任意大小的整数,包括负整数。
1)整数分隔符
书写很大的数时,可使用下划线将其中的数字分组,使其更清晰易读。
num1 = 1_000_000_000_000_000
print(num1) # 1000000000000000
存储这种数时,Python会忽略其中的下划线。在Python看来,1_000_000_000_000_000 与1000000000000000 没什么不同。这种表示法适用于整数和浮点数,但只有Python 3.6及以上版本支持。
2)type 与 isinstance 类型判断
可以使用 type() 来查看变量类型,使用 isinstance() 来判断变量类型。
type() 和 isinstance () 的区别在于 typ e() 不会认为子类是一种父类类型,isinstance () 会认为子类是一种父类类型。
num1 = True
num2 = 10
print(type(num1)) # <class 'bool'>
print(type(num2)) # <class 'int'>
print(type(num1) == type(num2)) # False
print(isinstance(num1, bool)) # True
print(isinstance(num1, int)) # True,Python3中,bool是int的子类
print(isinstance(num2, int)) # True
3)小整数池
Python将 [-5, 256] 的整数维护在小整数对象池中。这些整数提前创建好且不会被垃圾回收,避免了为整数频繁申请和销毁内存空间。不管在程序的什么位置,使用的位于这个范围内的整数都是同一个对象。
4)大整数池
一开始大整数池为空,每创建一个大整数就会向池中存储一个。
注意事项
-
不同的 Python 实现:小整数池的范围和实现细节可能因 Python 的不同实现(如 CPython、Jython、IronPython 等)而有所不同。上述提到的[-5, 256]范围是 CPython 的默认实现。
-
有时连续赋值的相同大整数也可能指向同一对象,这是因为Python环境的优化机制,但是这个优化不是绝对的,也取决于解释器以及交互式以及脚本环境。
2. float浮点型
Python将所有带小数点的数称为浮点数。要注意在使用浮点数进行计算时可能会存在微小误差,可以通过导入decimal解决。
num1 = 0.1
num2 = 0.2
print(num1 + num2) # 0.30000000000000004
from decimal import Decimal
num3 = Decimal('1.0')
num4 = Decimal('0.9')
print(num3-num4)
也可以使用科学计数法表示浮点数。
num1 = 1.3e7
print(num1) # 13000000.0
3. bool布尔型
布尔型变量只有 True 和 False,用于真假的判断。
bool1 = True
bool2 = False
print(bool1, bool2) # True False
Python3中,bool 是 int 的子类,True 和 False 可以和数字相加。
True==1、False==0 会返回 True
is 运算符用于比较两个对象的身份(即它们是否是同一个对象,是否在内存中占据相同的位置),而不是比较它们的值。
print(True == 1) # True
print(False == 0) # True
print(True is 1) # False
print(False is 0) # False
在Python中,能够解释为假的值不只有False,还有:
- None
- 0
- 0.0
- False
- 所有的空容器(空列表、空元组、空字典、空集合、空字符串)
4. String字符串初识
字符串就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号。可使用反斜杠 \ 转义特殊字符。
str1 = 'This is a "string"'
str2 = "This is a 'string' too"
print(str1) # This is a "string"
print(str2) # This is a 'string' too
也可以方便的在字符串中包含单引号或双引号。
str1 = "This is a 'string'"
str2 = 'This is a "string" too'
print(str1) # This is a 'string'
print(str2) # This is a "string" too
也可以使用三个引号表示多行字符串。三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保持一小块字符串的格式是所谓的WYSIWYG(所见即所得)格式的。
一个典型的用例是,当你需要一块HTML或者SQL时,使用三个引号就很简单
str1 = """hello world
HELLO WORLD"""
print(str1)
在字符中使用特殊字符时,Python用反斜杠 \ 转义字符:
| 转义字符 | 说明 |
|---|---|
| \ | 在行尾作为续行符 |
| \\ | 反斜杠符号 |
| \' | 单引号 |
| \" | 双引号 |
| \b | 退格 |
| \n | 换行 |
| \t | 横向制表符 |
| \r | 回车,回到行首 |
1)intern机制
每个(字符串),不夹杂空格或者特殊符号,默认开启intern机制,共享内存,靠引用计数决定是否销毁。相同的字符串默认只保留一份,当创建一个字符串,它会先检查内存里有没有这个字符串,如果有就不再创建新的了。
2)字符串缓冲池
单个字母,长度为1的 ASCII 字符会被 interned,包括空字符。
5. 数据类型转换
1)自动类型转换(隐式转换)
对两种不同类型的数据进行运算,较小的数据类型(整数)就会转换为较大的数据类型(浮点数)以避免数据丢失,计算结果为浮点型:
num1 = 2
num2 = 3.0
print(num1 + num2) # 5.0
特别的,两个整型进行除法运算结果也是浮点型:
num1 = 9
num2 = 1
print(num1 / num2) # 9.0
而整型和字符串相加会报错,此时Python无法进行隐式转换完成计算:
num1 = 123
str1 = "456"
print(num1 + str1) # 报错
2)强制类型转换(显式转换)
可以通过函数对数据类型进行转换。
| 函数 | 说明 |
|---|---|
| int(x [,base]) | 将x转换为一个整数,x若为字符串可用base指定进制 |
| float(x) | 将x转换为一个浮点数 |
| complex(real[,imag]) | 创建一个实部为real,虚部为imag的复数 |
| str(x) | 将对象x转换为一个字符串 |
| repr( x ) | 将对象x转换为一个字符串,可以转义字符串中的特殊字符 |
| eval( x ) | 执行x字符串表达式,并返回表达式的值 |
| bin(x) | 将一个整数转换为一个二进制字符串 |
| oct(x) | 将一个整数转换为一个八进制字符串 |
| hex(x) | 将一个整数转换为一个十六进制字符串 |
| ord(x) | 将一个字符转换为它的ASCII整数值 |
| chr(x) | 将一个整数转换为一个Unicode字符 |
| tuple(s) | 将序列s转换为一个元组 |
| list(s) | 将序列s转换为一个列表 |
| set( s )**** | 转换s为可变集合 |
num_int = 123
num_str = "456"
print("num_int 数据类型为:",type(num_int))
print("类型转换前,num_str 数据类型为:",type(num_str))
num_str = int(num_str) # 强制转换为整型
print("类型转换后,num_str 数据类型为:",type(num_str))
num_sum = num_int + num_str
print("num_int 与 num_str 相加结果为:",num_sum)
print("sum 数据类型为:",type(num_sum))
输出:
num_int 数据类型为: <class 'int'>
类型转换前,num_str 数据类型为: <class 'str'>
类型转换后,num_str 数据类型为: <class 'int'>
num_int 与 num_str 相加结果为: 579
sum 数据类型为: <class 'int'>
6. 字符的编码和解码
# 创建一个 字符串类型数据
str1 = '你好中国'
print(str1)
print(type(str1))
# 将字符串数据类型转换为字节型数据的过程成为编码 encode,需要指定编码类型
byte1 = str1.encode(encoding='utf8')
# 4个字符转换为了12个字节, 所以一个汉字占用3个字节
print(byte1) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\xad\xe5\x9b\xbd'
print(type(byte1)) # <class 'bytes'>
# 在进行编码集使用时,一定要注意,使用什么编码集编码,就要使用它解码,否则报错.
# 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byt
# byte2 = str1.encode(encoding='gbk')
# print(byte2)
# print(type(byte2))
# 将字节型数据转换为字符型数据的过程称为解码 decode
str2 = byte1.decode(encoding='utf8')
print(str2) # 你好中国
print(type(str2)) # <class 'str'>
四. 输入与输出
1. 输入
如果接收用户在键盘上输入一些字符,Python提供了一个input()函数,可以让用户输入字符串,并存放到一个字符串变量里。
语法:字符串变量 = input(“提示信息”)
# Python开始等待你的输入。这时,你可以输入任意字符,然后按回车后完成输入。
input_str = input("请输入:")
# 输入完成后,不会有任何提示,刚才输入的内容存放到input_str变量里了
print("input_str数据类型为:",type(input_str))
# 输出input_str查看变量内容
print(input_str)
2. 输出
1)普通输出
# 使用print()可将内容打印。
print("Hello Python")
# 多个内容之间可以使用逗号隔开。
print("Hello", " Python")
# 可以使用 end= 来控制print()以什么结尾。
print("使用\\n结尾", end="\n") # 用\n结尾,等同于print("使用\\n结尾")
print('使用""结尾', end="") # 用空字符串结尾
print("Hello")
2)格式化输出
(1)字符串中使用 % 占位
int1 = 10
float1 = 3.14159
str1 = "int1 = %d, float1 = %f" % (int1, float1)
print(str1) # int1 = 10, float1 = 3.141590
格式符号列表:
| 格式符号 | 说明 |
|---|---|
| %d | 十进制整数 |
| %f | 浮点数,%.nf可指定显示小数点后n位 |
| %s | 字符串 |
| %o | 八进制整数 |
| %x | 十六进制整数 |
| %e | 科学计数法 |
(2)字符串.format()
# 方式1:不设置指定位置,按默认顺序
int1 = 10
float1 = 3.14159
bool1 = True
str2 = "int1 = {}, float1 = {}, bool1 = {}".format(int1, float1, bool1)
print(str2) # int1 = 10, float1 = 3.14159, bool1 = True
# 方式2:设置指定位置,不能和方式1混合使用
int1 = 10
float1 = 3.14159
bool1 = True
str2 = "int1 = {0}, float1 = {1}, bool1 = {2}".format(int1, float1, bool1)
print(str2) # int1 = 10, float1 = 3.14159, bool1 = True
# 方式3:设置参数
int1 = 10
float1 = 3.14159
bool1 = True
str2 = "int1 = {i1}, float1 = {f1}, bool1 = {b1}".format(i1=int1, f1=float1, b1=bool1)
print(str2) # int1 = 10, float1 = 3.14159, bool1 = True
(3)数字格式化:
float1 = 31415.9
str2 = "{:*^20,.2f}".format(float1)
print(str2) # *****31,415.90******
: 后可以添加多个参数对数字格式化:
- *:以 * 填充空白,不写则默认以空格填充。
- ^:可选 < 、 ^ 、 > ,分别是左对齐、居中、右对齐。
- 20:数字宽度为20,数字长度不足20则进行填充。
- ,:可选 , 和 _ ,每3位进行分隔。
- .2f:小数点后保留2位。
案例:
(4)使用大括号 {} 来转义大括号
print ("{0} 对应的位置是 {0}".format("hello")) # hello 对应的位置是 hello
print ("{} 对应的位置是 {{0}}".format("hello")) # hello 对应的位置是 {0}
(5)f-字符串
# 字符串前加上一个f ,字符串中的{}内写入变量名。
int1 = 10
float1 = 3.14159
str3 = f"int1 = {int1}, float1 = {float1}"
print(str3) # int1 = 10, float1 = 3.14159
# {}内变量名后可以加上 = ,打印时会在变量值前加上 变量名=。
int1 = 10
float1 = 3.14159
str3 = f"{int1 = }, {float1 = }"
print(str3) # int1 = 10, float1 = 3.14159
# {}外再套一层{},即{{}},会转义。
int1 = 10
float1 = 3.14159
str3 = f"{{int1 = }}, {{float1 = }}"
print(str3) # {int1 = }, {float1 = }