python与C++的一些区别以及一些新的东西
第一个Python程序
输入与输出




Python基础
数据类型和变量














字符串和编码





第一行代码的输出如下

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



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

使用list和tuple
这里直接全部看原文,全是新东西
条件判断





模式匹配





也就是使用第一行的args会匹配到第二个case,使用第二行的args会匹配到第三个case,使用第三行的args会匹配到第一个case
这里可能会产生一个疑问,就是为什么这里不用在后面写上一个if而是可以直接变量绑定了?实际上,tuple和list都可以这么做,比如下面的代码是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})")
循环


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



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




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


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

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



在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再试一遍同理




函数
调用函数



定义函数





函数的参数




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

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



高级特性
直接看原文
函数式编程
高阶函数



map/reduce





filter


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

“用filter求素数”见原文
sorted





返回函数

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



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




匿名函数



装饰器
直接看原文
对于
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,它的作用是在调用被装饰的函数之前,打印一条日志信息,表明哪个函数即将被调用。下面是对这段代码的详细解释:
-
定义装饰器
log:log是一个函数,它接收一个参数func,这个func是被装饰的函数。- 在
log函数内部,定义了另一个函数wrapper。这个wrapper函数是实际执行装饰逻辑的地方。它接收任意数量的位置参数*args和关键字参数**kw,这样它就可以接受任何函数的调用参数。 - 在
wrapper函数内部,首先打印一条日志信息,显示即将被调用的函数名(通过func.__name__获取)。 - 然后,
wrapper函数通过return func(*args, **kw)调用原始函数func,并传递所有接收到的参数。这意味着wrapper函数的行为最终是执行了原始的func函数,但在执行前后可以添加额外的逻辑。 - 最后,
log函数返回wrapper函数本身。这意味着当装饰器应用于某个函数时,实际上是将该函数替换为了wrapper函数。
-
应用装饰器
@log到函数now:- 在定义
now函数之前,使用了@log语法糖。这等价于将now函数作为参数传递给log函数,并将log函数返回的结果(即wrapper函数)重新绑定到now这个名字上。 - 因此,当调用
now()时,实际上是在调用wrapper函数,而不是原始的now函数。
- 在定义
-
调用被装饰的函数
now:- 当执行
now()时,首先执行的是wrapper函数。 wrapper函数打印出call now():,表明now函数即将被调用。- 然后,
wrapper函数调用原始的now函数,打印出2024-6-1。 - 最终,
now函数的执行结果(如果有的话)由wrapper函数返回,但在这个例子中,now函数没有返回值。
- 当执行
总结,这段代码通过装饰器log,在不修改now函数本身的情况下,实现了在调用now函数之前打印日志信息的功能。
偏函数
直接看原文,第一个评论也看一看
模块
使用模块
直接看原文

每一个.py文件都有一个内置的属性__name__,当文件被直接运行的时候,其的值就为__main__,如果文件被其他文件用import导入,__name__的值就是该文件的名字
面向对象编程
类和实例
看原文
访问限制
看原文
继承和多态
看原文
有一说一这个多态比较离谱,就像文章最后面说的,动态语言接受的根本就不知道到底是Animal类型还是他的子类型,也就是说如果Animal没定义run这个函数也是可以运行所有代码的,这就跟多态屁关系没有了;所以就记住子类的同名函数会覆盖父类的同名函数即可
获取对象信息
看原文

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

浙公网安备 33010602011771号