Python | 学习笔记
环境:Python 3.9.7
1. 简介
针对有一定开发经验快速学习Python语法。
2. 注释
# 这个是注释内容
print("hello world") # 注意print不是线程安全的
3. 基本类型
注意:
- 任何运算中只要有一方是浮点数,结果必然是浮点数。
- Python浮点数也有精度问题。
3.1. 字符串
当然也能使用\t\n...
之类转义字符
# 打印message字符串
message = "hello world"
print(message)
# 字符串格式化
# 注意:需要Python 3.6以上版本
first_name = "Zhang"
last_name = "SanFeng"
full_name = f"{first_name}{last_name}"
print(full_name)
# 大写、小写、去左右空白
word = " name "
print(word.upper())
print(word.lower())
print(word.strip())
3.2. 整数
# 加(+)、减(-)、乘(*)、除(/)
num = 1 + 1
print(num)
# 乘方(**)
num2 = 10 ** 2
print(num2) # 100
3.3. 浮点数
# 加(+)、减(-)、乘(*)、除(/)
num = 1.1 + 1.9
print(num)
# 乘方(**)
num2 = 10.5 ** 2
print(num2)
3.4. 列表
- 与其他语言中数组相同
- 索引从0开始
- 索引-1表示查看最后一个元素
- 列表与切片之间没有底层引用
创建
# 直接创建
nums = [1, 2, 3, 4]
print(nums)
# 使用range创建
# 1
# nums2 = [1, 2, 3, 4]
nums2 = list(range(1, 5))
print(nums2)
# 2
# nums3 = [1, 3]
nums3 = list(range(1, 5, 2))
print(nums3)
# 列表解析
# nums4 = [1, 4, 9, 16]
nums4 = [value ** 2 for value in range(1, 5)]
print(nums4)
增
nums = [1, 2, 3, 4]
# 末尾追加
nums.append(5)
# 指定位置插入insert(索引, 值)
nums.insert(5, 6)
print(nums)
删
nums = [1, 2, 3, 4]
# 直接删除
del nums[0]
print(nums)
# 弹出末尾元素并删除
del_num = nums.pop()
# 弹出指定元素元素并删除
del_num2 = nums.pop(1)
print(nums, del_num, del_num2)
# 根据值删除
nums.remove(2)
print(nums)
改
nums = [1, 2, 3, 4]
nums[0] = 99
print(nums)
查
nums = [1, 2, 3, 4]
# 查看第1个元素
print(nums[0])
# 查看第2个元素
print(nums[1])
# 查看最后1个元素
print(nums[-1])
# 查看列表长度
length = len(nums)
print(length)
排序
nums = [3, 1, 2, 4]
# 从小到大
nums.sort()
print(nums)
# 从大到小
nums.sort(reverse=True)
print(nums)
# 不修改原数组排序
new_nums = sorted(nums)
print(new_nums)
切片
nums = [1, 2, 3, 4]
# 切片
# nums2 = [1, 2]
nums2 = nums[:2]
print(nums2)
# nums3 = [2, 3, 4]
nums3 = nums[1:]
print(nums3)
# nums4 = [2]
nums4 = nums[1:2]
print(nums4)
# 复制列表
# copy_nums = [1, 2, 3, 4]
copy_nums = nums[:]
print(copy_nums)
3.5. 元组
创建
nums = (1, 2, 3)
查看
nums = (1, 2, 3)
# 1
print(nums[0])
# 2
for num in nums:
print(num)
注意:元素不能修改元素数据,但能给元组整体重新赋值。
nums = (1, 2, 3)
# error example
nums[0] = 11
# correct example
nums = (11, 2, 3)
3.6. 字典
注意:
- 字典中元素的排列顺序与定义时相同。
# 创建
person = {
'name': 'Yimt',
'age': 18,
}
# 获取
# 1.如果不存在会报错
print(person['name'])
print(person['age'])
# 2.设置不存在默认值
name = person.get('name', 'default name')
print(name)
# 添加
person["phone"] = 1234
# 删除
del person["phone"]
# 遍历键值
for k, v in person.items():
print(k, v)
# 遍历键
for k in person.keys():
print(k)
# 遍历值
for v in person.values():
print(v)
# 嵌套
dic1 = {
'a': [1, 2, 3],
'b': {
'c': 1,
'd': 2
}
}
print(dic1)
3.7. 常量
Python中没有常量
# 使用下面替代常量
MAX_AGE = 150
3.8. 通用
# 多个变量同时赋值
a, b = 1, 2
print(a, b)
# 下划线
money = 10_000
print(money)
4. 条件判断
# 基本
num = 3
if num == 1:
print("is one")
elif num == 2:
print("is two")
else:
print("default")
# and
if True and True:
print("True")
# or
if False or True:
print("True")
# in
if 1 in [1, 2, 3]:
print("in is True")
# not
if not False:
print("False")
5. 循环
5.1. for
- range(开始, 结束, 步进):range返回数据包含开始不包含结束
nums = [1, 2, 3, 4]
# 遍历列表
for num in nums:
print(num)
# 通过range遍历
# 1~4
for num in range(1, 5):
print(num)
# 控制range步进
# 1、3
for num in range(1, 5, 2):
print(num)
# 倒序遍历列表
for num in range(len(nums)-1, -1, -1):
print(num)
5.2. while
num = 0
while True:
num += 1
# 对2取余等于0跳过
if num % 2 == 0:
continue
# 大于10停止
if num > 10:
break
print(num)
6. 函数
# 普通方法定义
def sum(a, b):
return a + b
print(sum(1, 2))
# 指定参数类型
def sum(a, b: int):
return a + b
print(sum(1, 2))
# 可变参数
def sum(*nums):
result = 0
for num in nums:
result += num
return result
print(sum(1, 2, 3))
# 默认值
def sum(a, b = 1):
return a + b
print(sum(1))
# 指定形参传值
def sum(a=1, b=1):
return a + b
print(sum(b = 3))
7. 模块
tools.py
def sum(a, b):
return a + b
7.1. 导入整个模块
hello.py
import tools
print(tools.sum(1, 2))
7.2. 导入特定函数
hello.py
from tools import sum
print(sum(1, 2))
7.3. 函数别名
hello.py
from tools import sum as s
print(s(1, 2))
7.4. 模块别名
hello.py
import tools as t
print(t.sum(1, 2))
7.5. 导入模块所有函数
hello.py
from tools import *
print(sum(1, 2))
8. 类
注意:
__init__
方法在创建类时自动执行
8.1. 基本使用
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(f"{self.name} is now sitting")
def roll_over(self):
print(f"{self.name} rolled over!")
# 创建实例
my_dog = Dog('Willie', 6)
# 调用方法
my_dog.sit()
my_dog.roll_over()
8.2. 继承
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
def get_age(self):
return self.age
def print_info(self):
print(f"name: {self.name} age: {self.age}")
class Student(Person):
def __init__(self, name, age, school_name):
super().__init__(name, age)
self.school_name = school_name
def get_school_name(self):
return self.school_name
def print_info(self):
"""重写父类方法"""
print(f"name: {self.name} age: {self.age} school_name: {self.school_name}")
8.3. 抽象类
子类继承抽象类的话就必须要实现抽象类的所有抽象方法
import abc
class Animal(object, metaclass=abc.ABCMeta):
def __init__(self, name):
# __表示私有变量
self.__name = name
@abc.abstractmethod
def introduce(self):
pass
def get_name(self):
return self.__name
@staticmethod
def say_hello():
print("hello")
class Dog(Animal):
def __init__(self, name):
# 初始化父类
super().__init__(name)
self.__name = name
def eat(self):
print(f"{self.__name} eat")
def introduce(self):
print("Dog")
def demo(a: Animal):
a.introduce()
# 君子之约
print(f"demo = {a.get_name()}")
if __name__ == '__main__':
dog: Animal = Dog('小明')
dog.eat()
demo(dog)
8.4. 类导入
person.py
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
def get_age(self):
return self.age
def print_info(self):
print(f"name: {self.name} age: {self.age}")
hello.py
# 导入单个类
from person import Person
p = Person('Yimt', 18)
p.print_info()
# 导入多个类
# from person import Person, ClassA, ClassB...
# 导入整个模块
# import Person
# 导入模块中的所有类
# import Person import *
# 使用别名
# from person import Person as P
9. 异常处理
if __name__ == '__main__':
try:
# 触发除0异常
print(5 / 0)
except ZeroDivisionError:
print("除数不能为0!")
except Exception:
print("通用异常匹配")
else:
# 可选项
print("执行成功!")
finally:
# 可选项
print("此处不论成功或异常都会执行!")
10. 测试
import unittest
def math_sum(a, b):
return a + b
class MathTestCase(unittest.TestCase):
def test_math_sum(self):
result = math_sum(1, 2)
# 可以修改3为4,查看错误提醒
self.assertEqual(result, 3, msg="测试失败")
11. 多线程
11.1. 简介
Python如果想要实现多线程主要有两种方式,第一种继承threading.Thread,第二种通过回调。推荐使用继承的方式,继承方式功能更强,可以实现启动、停止、判断是否存活等状态。
11.2. 实现方式
11.2.1. threading.Thread(推荐使用)
import threading
import time
class Hello(threading.Thread):
def __init__(self, name):
# 注意不设置当前线程守护线程,主线程退出过后,后台线程还是继续运行程序不会退出
threading.Thread.__init__(self, daemon=True)
self.__name = name
def run(self): # 实现多线程
count = 0
while True:
count += 1
print(f"{self.__name} hello {count}")
time.sleep(2)
if __name__ == '__main__':
Hello('张三').start() # 启动第一个
time.sleep(1) # 防止print同时打印,print不是线程安全的
Hello('李四').start() # 记动第二个
time.sleep(10)
11.2.2. _thread
import _thread
import time
def hello(name):
count = 0
while True:
count += 1
print(f"{name} hello {count}")
time.sleep(2)
if __name__ == '__main__':
_thread.start_new_thread(hello, ('张三',))
_thread.start_new_thread(hello, ('李四',))
time.sleep(10)
12. 锁
import threading
if __name__ == '__main__':
l = threading.Lock()
l.acquire() # 请求锁
l.release() # 释放锁
# 注意: 不是读写锁意思
rl = threading.RLock() # 重入锁
rl.acquire() # 请求锁 允许同一个线程可以多次请求
rl.release() # 释放锁
13. 参考
- 《Python编程从入门到实践(第2版)》