Python
Python中的字符串是不可变的,因此对字符串的任何修改都会创建一个新的字符串对象。
注释
当行注释用#,多行注释用'''或""",三引号还可以作为方法的参数,用来保留字符串样式
# print("hello \nworld")
'''
for i in range(1, 11):
print(f'第{i}个是{i}')
'''
"""
for i in range(1, 11):
print(f'第{i}个是{i}')
"""
print('''hello
world''')
上面的代码会输出
hello
world
变量
变量的定义,直接写变量名并且赋值
name = 'LiLei'
age = 20
var = 10
var = 'LeiLei' #变量还可以赋值不同类型
常量
一般使用全部大写来定义常量名
is和==
== 比较运算符 判断==左右两边的值是不是相等
num = 1
print(num == 1)
is 判断对象的指向的地址是否相等,比较是否是同一个对象
num = 1
name = 'LeiLei'
print(num is name)
//False
在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号。可使用反斜杠 \ 转义特殊字符。
每个(字符串),不夹杂空格或者特殊符号,默认开启intern机制,共享内存,靠引用计数决定是否销毁。相同的字符串默认只保留一份,当创建一个字符串,它会先检查内存里有没有这个字符串,如果有就不再创建新的了。
f-string:表示格式化的字符串,主要作用是简化了字符串格式化的过程,使得代码更加简洁和易读。
f-string 使用大写的'F'或者'f'作为字符串的前缀,然后在字符串中花括号{}来标记需要插入或替换的表达式。
for i in range(1, 11):
print(f'第{i}个是{i}')
强制类型转换
| 函数 |
说明 |
| int(x [,base]) |
将x转换为一个整数,x若为字符串可用base指定进制 |
| float(x) |
将x转换为一个整数,x若为字符串可用base指定进制 |
| 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'>
字符的编码和解码
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'>
// 将字节型数据转换为字符型数据的过程称为解码 decode
str2 = byte1.decode(encoding='utf8')
print(str2) // 你好中国
print(type(str2)) // <class 'str'>
字符串占位符
//(1)字符串中使用 % 占位
int1 = 10
float1 = 3.14159
str1 = "int1 = %d, float1 = %f" % (int1, float1)
print(str1)
// int1 = 10, float1 = 3.141590
//(2)字符串.format()
int1 = 10
float1 = 3.14159
bool1 = True
str2 = "int1 = {}, float1 = {}, bool1 = {}".format(int1, float1, bool1)
print(str2)
// int1 = 10, float1 = 3.14159, bool1 = True
//设置参数
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
成员运算符
| 运算符 |
说明 |
实例 |
| in |
在指定的序列中找到值返回 True,否则返回 False |
a in ['a', 'b', 'c'] |
| not in |
在指定的序列中没有找到值返回 True,否则返回 False |
a not in ['a', 'b', 'c'] |
身份运算符
| 运算符 |
说明 |
实例 |
| is |
判断两个标识符是不是引用自相同对象 |
a is b,类似id(a) == id(b)。如果引用的是同一个对象则返回True,否则返回False |
| is not |
判断两个标识符是不是引用自不同对象 |
a is not b,类似id(a) != id(b)。如果引用的不是同一个对象则返回True,否则返回False |
# -------------身份运算符---------------
m = 20
n = 20
q = 30
print(m is n) // True 判断m和n在内存中是否指向同一个地址
print(n is q) // False
print(n is not q) // True
# id() 用于获取对象在内存中的地址
print(id(m) == id(n)) # True
print("-" * 30)
# -------------is和==的区别---------------
a = [1,2,3]
b = a
print(b is a) // True
print(b == a) // True 比较地址中的内容是否相同
b = a[:] //拷贝a列表中的数据到b列表中
print(b)
print(b is a) // False
print(b == a) // True
分支语句
if 表达式:
语句1
else:
语句2
if 表达式1:
语句1
elif 表达式2:
语句2
elif 表达式3:
语句3
else: // else如不需要可以省略
语句4
match 对象值:
case 值1:
语句1
case 值2:
语句2
case _:
匹配所有
//Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。
//if语句的判断条件可以用条件表达式来表示其关系,后面的:必须加。其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同
//一范围,缩进取消后,就不在分支范围了。如果条件不成立,不执行语句块内容。
:= 赋值并返回结果运算法
match ret := randint(0,15)
case 1:
print(f'随机数为{ret}')
三目运算符
表达式1 if 判断条件 else 表达式2
num1 = 2
num2 = 3
max_num = num1 if num1 > num2 else num2
print(max_num)
while循环
先判断条件是否成立,如果条件成立就执行循环体一次;然后再判断条件是否成立,如果成立,继续执行循环体,直到循环条件不成立的时候,才会结束循环,执行循环下面的其他语句。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。执行语句可以是单个语句或语句块。
while 表达式:
语句-循环体
rabbit = 2
week = 1
while week < 10:
rabbit = rabbit + rabbit * 2
week += 1
print(f"第{week}周有{rabbit}只兔子")
//while 后可以加上 else,当 while 表达式结果为 False 时会执行 else 中的语句。
rabbit = 2
week = 1
while week < 10:
rabbit = rabbit + rabbit * 2
week += 1
else:
print(f"第{week}周有{rabbit}只兔子")
//此时else中代码,写在else中和写在循环外效果一样。else一般和 break一起使用,循环通过break终止后,else中的代码不会执行。
for循环
for循环
语法:
for 临时变量 in 可迭代对象:
循环体
else:
所有循环结束之后,执行的代码
list1 = [1,2,3,4,5,6,7,8,9]
print(list1)
for i in list1:
print(i)
str1 = 'Hello World'
for i in str1:
print(i,end=' ')
for i in range(1, 11):
print(i)
循环相关的关键字
continue
跳出当前正在进行的循环,继续下次循环
break
跳出整个循环,不会执行循环的else分支
pass
循环体或者的函数体的占位
列表
列表使用 [] 定义,数据之间使用 , 分隔。
1) 通过索引获取列表中元素
list1 = [100, 200, 300, 400, 500]
print(list1[1]) // 200
print(list1[-2]) // 400
2) 列表切片
list1 = [100, 200, 300, 400, 500]
print(list1) // 取全部元素
print(list1[:]) // 复制整个列表
print(list1[2:4]) // 取索引从2开始到4(不包含)的元素
print(list1[2:]) // 取索引从2开始到末尾的元素
print(list1[:2]) // 取索引从0开始到2(不包含)的元素
print(list1[2:-1]) // 取索引从2开始到-1(不包含)的元素
print(list1[::-1]) // 倒序取元素
3) 向列表中添加元素
list1 = [100, 200, 300, 400, 500]
list1.append(600) # 在列表末尾追加元素
list1.insert(2,700) # 在列表指定的位置追加元素
print(list1)
4) 列表相加
list1 = [100, 200, 300]
list2 = ["a", "b", "c"]
print(list1 + list2) // [100, 200, 300, 'a', 'b', 'c']
5) 列表乘法
list1 = [100, 200, 300]
print(list1 * 2) // [100, 200, 300, 100, 200, 300]
6) 修改列表中元素
6.1 通过下标修改
list1 = [100, 200, 300, 400, 500]
list1[0] = -1
print(list1)
6.2 通过切片修改
list1 = [100, 200, 300, 400, 500]
list1[2:4] = ["a", "b", "c"]
print(list1)
7) 检查成员是否为列表中元素
list1 = [100, 200, 300]
print(100 in list1) // True
8)获取列表长度
list1 = [100, 200, 300]
print(len(list1)) // 3
9) 求列表中元素的最大值、最小值、加和
list1 = [100, 200, 300, 400, 500]
print(max(list1)) // 500
print(min(list1)) // 100
print(sum(list1)) // 1500
10) 遍历列表
10.1直接遍历列表元素
list1 = [100, 200, 300, 400, 500]
for i in list1:
print(i)
10.2 通过下标遍历列表
list1 = [100, 200, 300, 400, 500]
for i in range(len(list1)):
print(i, list1[i])
10.3 使用enumerate()同时获取列表的下标和元素
list1 = [100, 200, 300, 400, 500]
for i, val in enumerate(list1):
print(i, val)
11) 删除列表指定位置元素或者切片
list1 = [100, 200, 300, 400, 500]
del list1[2]
print(list1)
12) 嵌套列表
列表中元素可以为列表。
list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for inner_list in list1:
print(inner_list)
13) 列表推导式
列表推导式是 Python 中一种简洁创建列表的方式,它将一个可迭代对象(如列表、元组、集合、字符串等)的元素通过某种运算或条件筛选后生成一个新的列表。
(1)基础的列表推导式
squares = [x**2 for x in range(5)]
print(squares) // [0, 1, 4, 9, 16]
(2)带条件的列表推导式
squares = [x**2 for x in range(10) if x % 2 == 0]
print(squares) // [0, 4, 16, 36, 64]
(3)使用现有列表的列表推导式
list1 = [1, 2, 3, 4, 5]
squares = [x**2 for x in list1]
print(squares) // [1, 4, 9, 16, 25]
(4)包含多个循环的列表推导式
list1 = [1, 2, 3, 4, 5]
list2 = ["a", "b", "c", "d", "e"]
tuple_list = [(i, j) for i in list1 for j in list2]
print(tuple_list)
14) zip()函数
zip() 函数可将多个可迭代对象中对应元素打包为一个个元组。
list1 = [1, 2, 3, 4, 5]
list2 = ["a", "b", "c", "d", "e"]
zipped = zip(list1, list2)
print(list(zipped))
元组
//元组是不可变的,不可以对元组中的元素进行修改
tuple1 = (100, 200, 300, 400, 500)
//元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。
tuple1 = (100,)
//也可以通过元组推导式创建元组。
tuple_generator = (x for x in range(10)) // 获取生成器对象
print(tuple_generator)
tuple1 = tuple(tuple_generator) // 转换为元组
print(tuple1)
//访问元组
tuple1 = (100, 200, 300, 400, 500)
print(tuple1[2])
print(tuple1[-1])
print(tuple1[2:4])
//元组相加
tuple1 = (100, 200, 300)
tuple2 = ("a", "b", "c")
print(tuple1 + tuple2) // (100, 200, 300, 'a', 'b', 'c')
//元组乘法
tuple1 = (100, 200, 300)
print(tuple1 * 2) // (100, 200, 300, 100, 200, 300)
//检查成员是否为元组中元素
tuple1 = (100, 200, 300, 400, 500)
print(300 in tuple1) // True
//获取元组长度
tuple1 = (100, 200, 300, 400, 500)
print(len(tuple1)) // 5
//求元组中元素的最大值、最小值、加和
tuple1 = (100, 200, 300, 400, 500)
print(max(tuple1)) // 500
print(min(tuple1)) // 100
print(sum(tuple1)) // 1500
//遍历元组
tuple1 = (100, 200, 300, 400, 500)
for i in tuple1:
print(i)
for i in range(len(tuple1)):
print(i, tuple1[i])
for i, val in enumerate(tuple1):
print(i, val)
//元组的不可变
元组的不可变指的是元组所指向的内存中的内容不可变,但可以重新赋值。
tuple1 = (100, 200, 300)
print(id(tuple1), tuple1)
tuple1 = tuple1 + (1, 2, 3)
print(id(tuple1), tuple1)
如果元组中元素是可变数据类型,其嵌套项可以被修改。
tuple1 = (100, 200, 300, [1, 2, 3])
tuple1[3].append(4)
print(tuple1) // (100, 200, 300, [1, 2, 3, 4])
集合Set
1. 创建集合
可以通过{}或set()创建集合,但创建空集合需要使用set()而非{},因为{}会创建空字典。
set1 = {1, 2, 3}
set2 = set([1, 2, 3]) // 使用set()函数从列表创建集合
set3 = set()
print(set1, set2, set3)
也可以通过集合推导式创建集合。
set1 = {x for x in range(10) if x % 2 == 0}
print(set1) //{0, 2, 4, 6, 8}
2. 向集合中添加元素
set1 = {1, 2, 3}
set1.add(4)
set1.add(5)
print(set1)
3. 从集合中删除元素
set1 = {1, 2, 3}
set1.remove(2)
print(set1)
4. 检查成员是否为集合中元素
set1 = {1, 2, 3, 4, 5}
print(2 in set1) // True
5. 获取集合长度
set1 = {1, 2, 3, 4, 5}
print(len(set1)) // 5
6. 求集合中元素的最大值、最小值、加和
set1 = {1, 2, 3, 4, 5}
print(max(set1)) // 5
print(min(set1)) // 1
print(sum(set1)) // 15
7. 遍历集合
my_set = {1, 2, 3, 4, 5}
for item in my_set:
print(item)
字典Dict
1. 创建字典
//可以通过{}或dict()创建字典。
dict1 = {}
dict2 = dict()
dict3 = {"name": "Alice", "age": 18, "gender": "male"}
dict4 = dict(name="Bob", age=20, gender="female")
dict5 = dict([("name", "Tom"), ("age", 22), ("gender", "male")])
print(dict1)
print(dict2)
print(dict3)
print(dict4)
print(dict5)
//也可以通过字典推导式创建字典。
squares = {x: x**2 for x in range(4)}
print(squares) // {0: 0, 1: 1, 2: 4, 3: 9}
2. 访问字典
//可通过 [] 访问字典中的元素。key不存在时会报错。
dict1 = {"name": "Alice", "age": 18, "gender": "male"}
print(dict1["name"]) // Alice
print(dict1["age"]) // 18
print(dict1["gender"]) // male
print(dict1["address"]) // 报错
//也可以通过get()获取字典中的元素。key不存在时会返回None,也可以指定默认值。
dict1 = {"name": "Alice", "age": 18, "gender": "male"}
print(dict1.get("name")) // Alice
print(dict1.get("age")) // 18
print(dict1.get("gender")) // male
print(dict1.get("address")) // None
print(dict1.get("address", "earth")) // earth
3. 向字典中添加元素
//为字典指定的key赋值value,若key原本不存在则会被添加。
dict1 = {"name": "Alice", "age": 18, "gender": "male"}
dict1["address"] = "earth"
print(dict1)
4. 修改字典中元素
//通过key修改对应的value。
dict1 = {"name": "Alice", "age": 18, "gender": "male"}
dict1["name"] = "Bob"
print(dict1)
5. 检查成员是否为字典中的key
dict1 = {"name": "Alice", "age": 81, "gender": "male"}
print("name" in dict1) // 检查key是否存在
print("Alice" in dict1) // 无法直接检查value是否存在
6. 获取字典长度
dict1 = {"name": "Alice", "age": 81, "gender": "male"}
print(len(dict1)) // 3
7.遍历字典
my_dict = {'Name': 'Tom', 'Age': 17}
# 遍历出所有k
keys = my_dict.keys()
for k in keys:
print (k)
print("-" *20)
# 遍历出所有v
vals = my_dict.values()
print(vals)
for v in vals:
print (v)
print("-" *20)
# k-v遍历
keys = my_dict.keys()
for k in keys:
print (k + "---" + str(my_dict[k]))
print("-" *20)
kv = my_dict.items()
for i in kv:
print(i)
8.删除字典元素
my_dict = {'Name': 'Tom', 'Age': 17}
del my_dict['Name'] # 删除键 'Name'
my_dict.clear() // 清空字典
del my_dict // 删除字典
print (my_dict)
函数
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名 (参数列表) :
函数体
[return]
不定长参数
参数的个数是不确定的。
(1)语法:
def 函数名([普通参数,] *var_args_tuple ):
函数体
def 函数名([普通参数,] **var_args_dict ):
函数体
加了两个星号 ** 的参数会以字典的形式导入,后面就不能再有其他参数了
'''
该案例演示了函数调用时的不定长参数
'''
def printInfo(num,**vardict):
print(num)
print(vardict)
# return
printInfo(10,key1 = 20,key2 = 30)
printInfo(10,a = 20,b = 30)
解包传参
若函数的形参是定长参数,可以通过 * 和 ** 对列表、元组、字典等解包传参。
def func(a, b, c):
return a + b + c
tuple11 = (1, 2, 3)
print(func(*tuple11))
# 字典中key的名称和参数名必须一致
dict1 = {"a": 1, "b": 2, "c": 3}
print(func(**dict1))
强制使用位置参数或关键字参数
/ 前的参数必须使用位置传参,* 后的参数必须用关键字传参。
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
f(1, 2, 3, d=4, e=5, f=6)
防止函数修改列表
有时要函数对列表进行处理,又不希望函数修改原列表,copy.copy()浅拷贝,可以使用 copy.deepcopy()深拷贝
import copy
def multiply2(var1):
var1[3].append(400)
print("函数内处理后:", var1)
list1 = [1, 2, 3, [100, 200, 300]]
print("函数外处理前:", list1)
multiply2(copy.deepcopy(list1))
print("函数外处理后:", list1)
返回值
在程序开发中,有时候希望一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理。返回值就是函数完成工作后,给调用者的一个结果
在函数中使用 return 关键字可以返回结果 ,并结束正在执行的函数
如果return后面跟[表达式],在结束函数的同时向调用方返回一个表达式。
如果仅仅是return关键字,后面没有加内容,函数执行返回调用方None。
调用函数一方,可以使用变量来接收函数的返回结果
(1)不带表达式的 return 语句,返回 None。
def f(a, b, c):
pass
return
print(f(1, 2, 3)) // None
(2)函数中如果没有 return 语句,在函数运行结束后也会返回 None。
def f(a, b, c):
pass
print(f(1, 2, 3)) // None
(3)用变量接收返回结果
def add(num1,num2) :
'''求两个数的和'''
sum1 = num1 + num2
return sum1
res = add(10,20)
print("两个数的和为:" ,res)
(4)return 语句可以返回多个值,多个值会放在一个元组中。
def f(a, b, c):
return a, b, c, [a, b, c]
print(f(1, 2, 3)) // (1, 2, 3, [1, 2, 3])
变量作用域
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,如下代码:
# 分支,循环不会引入新的作用域
num = 2
if num > 1:
msg = "helloWorld"
print(msg)
def test():
msg_test = "welcome"
print(msg_test)
var1 = 100
def function_a():
global var1 //函数内使用 global 声明全局变量后,可以修改全局变量。
var1 = 200
print("var1:", var1)
//当全局变量为可变类型时,函数内不使用 global 声明,也可以对其进行修改。
list1 = [1, 2, 3]
def function_a():
list1[0] = -1000
print("list1:", list1)
//nonlocal 也用作内部作用域修改外部作用域的变量的场景,不过此时外部作用域不是全局作用域而是嵌套作用域。
def function_outer():
var1 = 1
print(var1)
def function_inner():
nonlocal var1
var1 = 200
function_inner()
print(var1)
function_outer() # var1: 1 -> 200