Python基础知识(一)

0 阅读13分钟
一. 注释
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中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
变量三要素(必须记住)

  • 变量名:给盒子起名字(如 namescore
  • 赋值符号 =:把数据放进盒子
  • 数据 / 值:盒子里装的内容(数字、字符串…)
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 有一组关键字,这些关键字不能用作变量名、函数名或任何其他标识符。 image.png
keyword.kwlist可以输出当前版本的所有关键字: image.png

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
  • 字符串
    • str:"hello", 'Python'
  • 空类型
    • NoneType:None

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位。

案例: image.png

(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 = }