首页 > 编程语言 >Python进阶学习笔记-基础篇

Python进阶学习笔记-基础篇

时间:2024-06-23 14:44:14浏览次数:30  
标签:10 进阶 Python my 笔记 对象 print 拷贝 pickle

打印原始字符串

print(r"D:\three\two\one\now")

D:\three\two\one\now

复现随机数

import random
x = random.getstate()
print(random.randint(1,10))
print(random.randint(1,10))
print(random.randint(1,10))
random.setstate(x)
print(random.randint(1,10))
print(random.randint(1,10))
print(random.randint(1,10))

浮点数精度运算函数decimal

# 浮点数采用E记法(科学计数法),所以如果要获得完全精准的浮点数,则需要使用decimal函数
import decimal
a = decimal.Decimal('0.1')
b = decimal.Decimal('0.2')
c = decimal.Decimal('0.3')
print(c)
print(a+b == c)
True

复数

# 复数分为实部和虚部,real和imag可以分别获取复数的实部和虚部x = 1+2j
print(x.real)
1.0
print(x.imag)
2.0

同时获取整除(向下取整)和取余函数divmod()

divmod(3,2)
(1,1)

幂运算函数pow()

# pow()还支持扩展参数--pow(x,y,z),计算x的y次方,然后将结果与z进行求余运算
pow(2,3,5)
3

布尔值类型

False
# 1、定义为False的对象:None和False
# 2、值为0的数字类型:0,0j,0.0,Decimal(0),Fraction(0,1)
# 3、空的序列和集合:‘’,[],{},set(),range(0)

True == 1
False == 0

# 逻辑运算优先级 not>and>or

条件表达式

x = 10
result = "greater than 5" if x > 5 else "less than or equal to 5"
print(result)

循环else语句

for i in range(1,10):
    # 重复执行的代码
else:
    # 循环正常结束后要执行的代码

count = 0
while count < 5:
    # 重复执行的代码
    count += 1
else:
    # 循环正常结束后要执行的代码

# 不管是while还是for只要遇到break,else下方的代码都是不执行的

切片

s = [1, 2, 3, 4, 5]
s[len(s):] = [6] # == s.append(6)
s[len(s):] = [7, 8, 9] # == s.extend([7, 8, 9])

创建不可变集合

frozenset(iterable)

my_set = {1, 2, 3}
my_frozenset = frozenset(my_set)
print(my_frozenset)  # 输出: frozenset({1, 2, 3})

浅拷贝与深拷贝

# 浅拷贝(Shallow Copy)与深拷贝(Deep Copy)是数据复制中的两种方式,主要用于Python中的对象复制。
# 浅拷贝:拷贝父对象,不会递归拷贝内部的子对象。
# 深拷贝:递归拷贝父对象及其内部的所有子对象。
# 在Python中,可以使用copy模块的copy()函数进行浅拷贝,使用deepcopy()函数进行深拷贝。

import copy
 
# 定义一个嵌套结构的对象
original = [1, 2, [3, 4]]

# 浅拷贝
shallow_copy = copy.copy(original)

# 深拷贝
deep_copy = copy.deepcopy(original)
 
# 修改原始对象
original[2][0] = "changed"
 
# 输出浅拷贝和深拷贝结果
print("Shallow Copy:", shallow_copy)  # 输出: [1, 2, ['changed', 4]]
print("Deep Copy:", deep_copy)        # 输出: [1, 2, [3, 4]]
# 浅拷贝中,原始列表中的子列表并没有被复制,浅拷贝后的对象和原始对象中的子对象会指向同一个内存地址。
# 而深拷贝会创建子对象的新副本,原始对象和拷贝后的对象中的子对象会指向不同的内存地址。

列表推导式

# 列表推导式(list comprehension)是一种简洁快速创建列表的方法。它的结构是在方括号内,包含一个表达式,后面跟一个 for 子句,然后是零个或多个 for 或 if 子句。返回的列表由表达式计算的结果组成。

# 创建一个新列表,其中包含原列表中每个元素的平方。
numbers = [1, 2, 3, 4, 5]
squares = [num**2 for num in numbers]
print(squares)  # 输出: [1, 4, 9, 16, 25]

# 添加条件判断:只包含原列表中能被3整除的元素的平方。
numbers = [1, 2, 3, 4, 5]
squares = [num**2 for num in numbers if num % 3 == 0]
print(squares)  # 输出: [9, 16]

# 多层嵌套:创建一个全排列列表。
colors = ['red', 'green', 'blue']
permutations = [x + y for x in colors for y in colors]
print(permutations)
# 输出: ['redred', 'redgreen', 'redblue', 'greenred', 'greengreen', 'greenblue', 'bluered', 'bluegreen', 'blueblue']

# 使用字典推导式创建一个新字典。
keys = ['a', 'b', 'c']
values = [1, 2, 3]
dictionary = {k: v for k, v in zip(keys, values)}
print(dictionary)  # 输出: {'a': 1, 'b': 2, 'c': 3}

集合推导式

# 集合推导式(set comprehension)是一种简洁的用于创建集合的方法,它类似于列表推导式,但用于集合。集合推导式可以使用Python表达式过滤和转换集合中的元素。

# 语法如下:
{expression for item in collection}
{expression for item in collection if condition}
# 其中expression是你对每个元素应用的表达式,item是迭代的临时变量,collection是你要迭代的集合,而if condition是可选的条件表达式,用于筛选符合条件的元素。

# 假设我们有一个列表,我们想要创建一个集合,其中包含列表中所有大于10的数的平方:
numbers = [3, 8, 12, 16, 20]
squares = {x**2 for x in numbers if x > 10}
print(squares)  # 输出: {144, 256, 225}

字典推导式

# 字典推导(dictionary comprehensions)是Python 3.7+中引入的特性,它允许你用一种简洁的方式创建字典。字典推导式是一种可读性较高的方式,可以用来转换或过滤字典。

# 字典推导式的基本语法如下:
{key: value for (key, value) in iterable}
{key: value for (key, value) in iterable if condition}

# 创建一个新的字典,其中包含原字典中键值对的平方:
numbers = {x: x**2 for x in range(10)}
# 结果: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

# 只保留原字典中值大于10的键值对:
numbers = {x: x**2 for x in range(20)}
squares = {k: v for (k, v) in numbers.items() if v > 10}
# 结果: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100, 11: 121, 12: 144, 13: 169, 14: 196, 15: 225, 16: 256, 17: 289, 18: 324, 19: 361}

# 使用字典推导式进行复杂操作,例如过滤出字典中的特定键值对:
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
result = {k: v for (k, v) in data.items() if k in ['a', 'b', 'c']}
# 结果: {'a': 1, 'b': 2, 'c': 3}

序列化与反序列化

# pickle模块用于序列化和反序列化Python对象结构。"Pickle"是Python对象的二进制表示,可以保存到文件中,或在进程间传输。
# pickle模块提供了四个功能:dump(), load(), dumps(), loads()。

# pickle.dump(obj, file, [protocol]):将对象obj保存到文件file中。protocol是序列化的协议,默认值为0,表示以文本的形式序列化。protocol的值为1或True表示以二进制的形式序列化。
import pickle
my_list = [123, 3.14, 'Hello', None]
# 创建文件并写入
with open('pickle_example.pkl', 'wb') as my_file:
    pickle.dump(my_list, my_file)


#pickle.load(file):从file文件中读取数据,并返回被序列化的对象。
import pickle
with open('pickle_example.pkl', 'rb') as my_file:
    my_list = pickle.load(my_file)
print(my_list)  # 输出:[123, 3.14, 'Hello', None]

# pickle.dumps(obj, [protocol]):将对象obj转换为一个字节流(bytes)。
import pickle
my_list = [123, 3.14, 'Hello', None]
my_bytes = pickle.dumps(my_list)
print(my_bytes)  # 输出:一串二进制字节

# pickle.loads(bytes_object):从字节流(bytes)中读取对象。
import pickle
my_bytes = b'\x80\x03]q\x00(K\x00K?\x85q\x01cbuiltin_module_tq\x02X\x06\x00\x00\x00floatq\x03\x8c\x0bu.'
my_list = pickle.loads(my_bytes)
print(my_list)  # 输出:[123, 3.14, 'Hello', None]

# 注意:pickle模块不是安全的。当unpickle对象时,对象的类定义和模块必须可用。如果不是由可信的源进行unpickle操作,那么可能会导致安全问题。

异常

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("错误:除数不能为0")
    except TypeError:
        print("错误:参数需要是数字类型")
    except Exception as e:
        print(f"未知错误:{e}")
    else:
        print("程序没有发生异常")
        return result
    finally:
        print("程序是否异常都会打印")
 
# 示例调用
print(divide(10, 0))
print(divide(10, 2))
print(divide("a", 2))


# 使用 raise 引发自定义异常
class CustomError(Exception):
    pass
 
def raise_custom_error():
    raise CustomError("发生了一个自定义异常")
 
# 使用 assert 语句检查条件是否满足
def check_condition(condition):
    assert condition, "条件不满足"
 
# 示例函数调用
try:
    raise_custom_error()
except CustomError as e:
    print(e)
 
# 检查条件是否满足,如果不满足则会引发 AssertionError
try:
    check_condition(False)
except AssertionError as e:
    print(e)

标签:10,进阶,Python,my,笔记,对象,print,拷贝,pickle
From: https://www.cnblogs.com/wanghongwei-dev/p/18263435

相关文章

  • Python进阶学习笔记-函数篇
    函数的特殊参数#/前的参数只能是位置参数,*后面的只能是关键字参数,之间的不限参数类型deffunc(a,b,/,c,*,d,e):print(a,b,c,d,e)func(1,2,3,d=4,e=5)func(1,2,c=3,d=4,e=5)#a,b不能以关键字形式传参,d,e只能以关键字参数传参#可变参数*argsdef......
  • Python进阶学习笔记-面向对象篇
    组合classEngine:"""引擎类,提供基本的引擎功能"""def__init__(self,power):self.power=powerdefstart(self):print(f"引擎启动,功率:{self.power}")classCar:"""汽车类,使用引擎类的功能"&......
  • python组合数据类型(集合)
             ......
  • python组合数据类型(列表)
              ......
  • 【Python机器学习】NMF——将NMF应用于人脸图像
    将NMF应用于之前用过的Wild数据集中的LabeledFaces。NMF的主要参数是我们想要提取的分量个数。通常来说,这个数字要小于输入特征的个数(否则的话,将每个像素作为单独的分量就可以对数据进行解释)。首先,观察分类个数如何影响NMF重建数据的好坏:importmglearn.plotsimportnumpy......
  • 硬件开发笔记(二十):AD21导入外部下载的元器件原理图库、封装库和3D模型
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139707771长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…硬件相关开发......
  • 硬件开发笔记(二十一):外部搜索不到的元器件封装可尝试使用AD21软件的“ManufacturerPart
    若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139869584长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…硬件相关开发......
  • python基本语法
              ......
  • 《Python编程:从入门到实践》
    书籍介绍 hi,我是神虚本书是一本针对所有层次的Python读者而作的Python入门书。全书分两部分:第一部分介绍用Python编程所必须了解的基本概念,包括matplotlib、NumPy和Pygal等强大的Python库和工具介绍,以及列表、字典、if语句、类、文件与异常、代码测试等内容;第二部......
  • python---OpenCv(二),背景分离方法较有意思
    目录边界矩形旋转矩形(最小外接矩形):计算轮廓找4个点的坐标把浮点型转为Int画轮廓边界矩形--(最大外接矩形)转灰度找轮廓找顶点画矩形显示背景分离方法(这个很好玩,可以识别在动的物体)边界矩形有两种类型的边界矩形:旋转矩形(最小外接矩形):是用最小面积绘制......