黄石市网站建设_网站建设公司_Oracle_seo优化
2026/1/7 15:38:26 网站建设 项目流程

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

这些都是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. 实际应用:用类表示现实事物(如学生、汽车)

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询