news 2026/4/15 9:48:16

python初学时很多内容不懂,汇总

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python初学时很多内容不懂,汇总

格式化输出的三种类型不太明白,不定长参数的打包与解包,分不清一颗星和两颗星,以及解包的时候如何解包?,递归函数中的循环不太会,类与对象的关系不太明白,在方法体中,有时分不清类成员与实例成员的区别?

这些都是Python学习中的常见困惑,我来逐一解释清楚:

一、格式化输出的三种类型

1.% 格式化(传统方法)

name="张三"age=20print("姓名:%s,年龄:%d"%(name,age))# 常用占位符:%s字符串,%d整数,%f浮点数

2.str.format()(Python 2.6+)

name="张三"age=20print("姓名:{},年龄:{}".format(name,age))print("姓名:{name},年龄:{age}".format(name=name,age=age))

3.f-string(Python 3.6+ 推荐)

name="张三"age=20print(f"姓名:{name},年龄:{age}")print(f"明年年龄:{age+1}")

二、不定长参数的打包与解包

单星 * 的作用

# 1. 打包:将多个位置参数打包成元组deffunc(*args):# args是元组print(args)func(1,2,3)# 输出:(1, 2, 3)# 2. 解包:将可迭代对象解包为位置参数defadd(a,b,c):returna+b+c numbers=[1,2,3]print(add(*numbers))# 等价于 add(1, 2, 3)

双星 ** 的作用

# 1. 打包:将多个关键字参数打包成字典deffunc(**kwargs):# kwargs是字典print(kwargs)func(name="张三",age=20)# 输出:{'name': '张三', 'age': 20}# 2. 解包:将字典解包为关键字参数defperson(name,age):print(f"{name}今年{age}岁")info={"name":"张三","age":20}person(**info)# 等价于 person(name="张三", age=20)

综合示例

deffunc(a,b,*args,**kwargs):print(f"a={a}, b={b}")print(f"args={args}")# 多余的位置参数print(f"kwargs={kwargs}")# 多余的关键字参数func(1,2,3,4,5,x=10,y=20)# a=1, b=2# args=(3, 4, 5)# kwargs={'x': 10, 'y': 20}

三、递归函数的循环理解

递归三要素

deffactorial(n):# 1. 基本情况(终止条件)ifn==1:return1# 2. 递归调用(向基本情况靠近)# 3. 返回值处理returnn*factorial(n-1)

理解递归调用栈

defcountdown(n):ifn<=0:print("结束!")else:print(f"当前值:{n}")countdown(n-1)# 递归调用print(f"返回层:{n}")countdown(3)# 输出:# 当前值:3# 当前值:2# 当前值:1# 结束!# 返回层:1# 返回层:2# 返回层:3

四、类与对象的关系

比喻理解

  • = 设计图纸(描述)
  • 对象= 根据图纸建造的房子(具体实例)
# 类:描述学生这类事物的共同特征classStudent:# 类属性:所有学生共享的属性school="XX大学"def__init__(self,name,age):# 实例属性:每个学生特有的self.name=name# 实例属性self.age=age# 实例属性# 对象:具体的学生stu1=Student("张三",20)# stu1是一个对象stu2=Student("李四",21)# stu2是另一个对象

五、类成员 vs 实例成员

关键区别

classMyClass:# 类属性:所有实例共享class_attr="我是类属性"def__init__(self,value):# 实例属性:每个实例独有self.instance_attr=value# 实例方法:操作实例属性definstance_method(self):print(f"访问实例属性:{self.instance_attr}")print(f"访问类属性:{self.class_attr}")@classmethoddefclass_method(cls):print(f"类方法访问类属性:{cls.class_attr}")# print(self.instance_attr) # 错误!不能访问实例属性# 测试obj1=MyClass("对象1")obj2=MyClass("对象2")# 类属性访问print(MyClass.class_attr)# 通过类访问print(obj1.class_attr)# 通过对象访问print(obj2.class_attr)# 所有对象看到的值一样# 修改类属性(影响所有实例)MyClass.class_attr="修改后的类属性"print(obj1.class_attr)# 输出:修改后的类属性print(obj2.class_attr)# 输出:修改后的类属性# 实例属性访问print(obj1.instance_attr)# 输出:对象1print(obj2.instance_attr)# 输出:对象2# 修改实例属性(只影响当前实例)obj1.instance_attr="修改对象1"print(obj1.instance_attr)# 输出:修改对象1print(obj2.instance_attr)# 输出:对象2(不变)

记忆技巧

特征类成员实例成员
定义位置类内部,方法外部__init__或实例方法内
访问方式类名.属性self.属性self.属性
存储位置类对象中实例对象中
修改影响影响所有实例只影响当前实例
内存消耗一份,所有实例共享每个实例单独存储

练习建议

  1. 写代码验证:创建类,修改类属性和实例属性,观察变化
  2. 画图理解:画出类和对象的内存关系图
  3. 实际应用:用类表示现实事物(如学生、汽车)

需要我针对某个点进一步解释吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 7:09:19

NIVIDIA高性能计算CUDA笔记(三) cuFFT的简介及实现案例

NIVIDIA高性能计算CUDA笔记&#xff08;三&#xff09; cuFFT的简介及实现案例 1. cuFFT库的简介&#xff08;Introduction of cuFFT libaray&#xff09; ​ Fourier变换是数字信号处理领域一个很重要的数学变换&#xff0c;它用来实现将信号实现将信号从时域到频域的变换…

作者头像 李华
网站建设 2026/4/14 10:35:29

Qwen3Guard-Gen-8B能否检测AI生成的环境污染误导信息?

Qwen3Guard-Gen-8B能否检测AI生成的环境污染误导信息&#xff1f; 在社交媒体上&#xff0c;一条看似权威的消息悄然传播&#xff1a;“最新研究证实&#xff0c;雾霾只是短期不适&#xff0c;不会引发肺癌。”语气笃定、术语专业&#xff0c;甚至引用了“某国际期刊论文”——…

作者头像 李华
网站建设 2026/4/10 23:30:45

大厂架构复盘!Reddit 面对亿级流量,为什么弃用 Milvus 选择了它?Pgvector/Redis/Qdrant 深度测评!

业务团队可能说他们想要个负重一吨&#xff0c;时速两百公里的马车…… 现如今&#xff0c;借助向量检索能力&#xff0c;实现基于语义相似度的智能搜索&#xff0c;已经是所有电商、推荐、社区平台技术架构的重要一环。 作为拥有约 1.08 亿日活、 11 亿月活用户的兴趣内容社…

作者头像 李华