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
已经变成了f1
等,解释器就会知道,f1
是依赖于i
的,于是去看i
的值,发现是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)
是会报错的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2023-10-13 洛谷4363总结