python与C++的一些区别以及一些新的东西

第一个Python程序

输入与输出

image

image

image

image

Python基础

数据类型和变量

image

image

image

image

image

image

image

image

image

image

image

image

image

image

字符串和编码

image

image

image

image

image

第一行代码的输出如下

image

解释如下:

  • '%2d-%02d' 是格式化字符串。
    • %2d 表示一个整数(d代表十进制),它至少占用2个字符的宽度。如果整数不足2位,则默认在左侧填充空格以达到2位的宽度。
    • -%02d 表示一个整数,它至少占用2个字符的宽度,如果整数不足2位,则在左侧填充0以达到2位的宽度。注意,-是字符串的一部分,用于在两个数字之间添加连字符。

image

image

image

其实也可以省掉标号,即将{0}换成{}{1:.2f}换成{:.2f}也可以

image

使用list和tuple

这里直接全部看原文,全是新东西

条件判断

image

image

image

image

image

模式匹配

image

image

image

image

image

也就是使用第一行的args会匹配到第二个case,使用第二行的args会匹配到第三个case,使用第三行的args会匹配到第一个case

这里可能会产生一个疑问,就是为什么这里不用在后面写上一个if而是可以直接变量绑定了?实际上,tuplelist都可以这么做,比如下面的代码是OK的

point = (1, 2)  
  
match point:  
    case (0, 0):  
        print("Origin")  
    case (x, 0):  
        print(f"Point on the x-axis: {x}")  
    case (0, y):  
        print(f"Point on the y-axis: {y}")  
    case (x, y):  
        print(f"Point: ({x}, {y})")

循环

image

image

如果执行print(range(5))会输出range(0,5)

image

image

image

使用dict和set

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

image

image

image

image

当然如果存在,get()就返回键对应的值

image

image

也就是说list真的是链表而不是数组

image

也就是说,对于一个作为键的对象(也就是一个变量,注意在Pyhton中,一切皆对象)指向的值如果改变了的话,我们重新计算这个对象的hash值肯定就会改变,就没有办法在字典中找到这个键对应的值了(实际上在Python中,可变对象的哈希值是不可计算的)

image

image

image

在Python中可变对象的哈希值是不可计算的,而set需要通过哈希值去判重,一个不可计算的东西怎么能用呢?所以set不可以放入可变对象。并且有如下代码

a = (1, 2, 3)
b = (1, [2, 3])
s = set()
s.add(a)
print(s)
#没问题,正常输出{(1,2,3)}
ss = set(b)
print(ss)
#不行,因为b里面的[2,3]是一个可变的元素,所以会报错
#剩下换成dict再试一遍同理

image

image

image

image

函数

调用函数

image

image

image

定义函数

image

image

image

image

image

函数的参数

image

image

image

image

原因:在Python中,当你定义一个带有默认参数的函数时,这个默认参数只会在函数定义时被评估一次。这意味着,如果你使用可变类型(如列表或字典)作为默认参数,那么每次调用函数时,如果未提供新的参数值,函数将使用同一个可变对象实例。这里多次不给参数的调用的话,都会使用同一个[],所以会产生上面的结果。所以一定要指向不变对象

image

剩下的从“可变参数”一直到最后直接去看原文

递归函数

image

image

image

高级特性

直接看原文

函数式编程

高阶函数

image

image

image

map/reduce

image

image

image

image

image

filter

image

image

单纯的filter返回的是一个filter对象,是一个惰性对象,可以像文中一样用list打开,也可以利用[*]解压缩

image

“用filter求素数”见原文

sorted

image

image

image

image

image

返回函数

image

注意f的括号指的是sum的那个括号,即f==sumf()==sum()

image

image

image

这个原因就是最开始所说的“返回的函数并没有立刻执行,而是直到调用了才执行”。具体一点,在Python中,当你在一个循环或条件语句内部定义一个函数时,这个函数在运行时(而非定义时)会查找它所依赖的变量的值。这种行为被称为“闭包”(closure)。也就是在定义f的时候,解释器只知道这个f的行为会依赖于i,而不会直接计算出i*i然后放入f中;在count这个函数执行完毕之后,i已经变成了3,然后调用f1等,解释器就会知道,f1是依赖于i的,于是去看i的值,发现是3,然后计算i*i,将其作为结果

image

image

image

image

匿名函数

image

image

image

装饰器

直接看原文

对于

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper
@log
def now():
    print('2024-6-1')
now()

的解释:
这段代码展示了Python中装饰器(decorator)的一个简单应用。装饰器是一种设计模式,允许你在不修改原有函数或方法定义的情况下,给函数或方法添加额外的功能。这里的装饰器名为log,它的作用是在调用被装饰的函数之前,打印一条日志信息,表明哪个函数即将被调用。下面是对这段代码的详细解释:

  1. 定义装饰器log

    • log是一个函数,它接收一个参数func,这个func是被装饰的函数。
    • log函数内部,定义了另一个函数wrapper。这个wrapper函数是实际执行装饰逻辑的地方。它接收任意数量的位置参数*args和关键字参数**kw,这样它就可以接受任何函数的调用参数。
    • wrapper函数内部,首先打印一条日志信息,显示即将被调用的函数名(通过func.__name__获取)。
    • 然后,wrapper函数通过return func(*args, **kw)调用原始函数func,并传递所有接收到的参数。这意味着wrapper函数的行为最终是执行了原始的func函数,但在执行前后可以添加额外的逻辑。
    • 最后,log函数返回wrapper函数本身。这意味着当装饰器应用于某个函数时,实际上是将该函数替换为了wrapper函数。
  2. 应用装饰器@log到函数now

    • 在定义now函数之前,使用了@log语法糖。这等价于将now函数作为参数传递给log函数,并将log函数返回的结果(即wrapper函数)重新绑定到now这个名字上。
    • 因此,当调用now()时,实际上是在调用wrapper函数,而不是原始的now函数。
  3. 调用被装饰的函数now

    • 当执行now()时,首先执行的是wrapper函数。
    • wrapper函数打印出call now():,表明now函数即将被调用。
    • 然后,wrapper函数调用原始的now函数,打印出2024-6-1
    • 最终,now函数的执行结果(如果有的话)由wrapper函数返回,但在这个例子中,now函数没有返回值。

总结,这段代码通过装饰器log,在不修改now函数本身的情况下,实现了在调用now函数之前打印日志信息的功能。

偏函数

直接看原文,第一个评论也看一看

模块

使用模块

直接看原文

image

每一个.py文件都有一个内置的属性__name__,当文件被直接运行的时候,其的值就为__main__,如果文件被其他文件用import导入,__name__的值就是该文件的名字

面向对象编程

类和实例

看原文

访问限制

看原文

继承和多态

看原文

有一说一这个多态比较离谱,就像文章最后面说的,动态语言接受的根本就不知道到底是Animal类型还是他的子类型,也就是说如果Animal没定义run这个函数也是可以运行所有代码的,这就跟多态屁关系没有了;所以就记住子类的同名函数会覆盖父类的同名函数即可

获取对象信息

看原文

image

如果MyDog这个类没有定义__len__这个函数,len(dog)是会报错的

posted @   最爱丁珰  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2023-10-13 洛谷4363总结
点击右上角即可分享
微信分享提示