2026/3/5 17:54:49
网站建设
项目流程
网站建设拾金手指下拉二一,衡水建设投资集团网站,百度搜索网站提交,佛山外贸网站制作公司格式化输出的三种类型不太明白#xff0c;不定长参数的打包与解包#xff0c;分不清一颗星和两颗星#xff0c;以及解包的时候如何解包#xff1f;#xff0c;递归函数中的循环不太会#xff0c;类与对象的关系不太明白#xff0c;在方法体中#xff0c;有时分不清类成…格式化输出的三种类型不太明白不定长参数的打包与解包分不清一颗星和两颗星以及解包的时候如何解包递归函数中的循环不太会类与对象的关系不太明白在方法体中有时分不清类成员与实例成员的区别这些都是Python学习中的常见困惑我来逐一解释清楚一、格式化输出的三种类型1.% 格式化传统方法name张三age20print(姓名%s年龄%d%(name,age))# 常用占位符%s字符串%d整数%f浮点数2.str.format()Python 2.6name张三age20print(姓名{}年龄{}.format(name,age))print(姓名{name}年龄{age}.format(namename,ageage))3.f-stringPython 3.6 推荐name张三age20print(f姓名{name}年龄{age})print(f明年年龄{age1})二、不定长参数的打包与解包单星 * 的作用# 1. 打包将多个位置参数打包成元组deffunc(*args):# args是元组print(args)func(1,2,3)# 输出(1, 2, 3)# 2. 解包将可迭代对象解包为位置参数defadd(a,b,c):returnabc numbers[1,2,3]print(add(*numbers))# 等价于 add(1, 2, 3)双星 ** 的作用# 1. 打包将多个关键字参数打包成字典deffunc(**kwargs):# kwargs是字典print(kwargs)func(name张三,age20)# 输出{name: 张三, age: 20}# 2. 解包将字典解包为关键字参数defperson(name,age):print(f{name}今年{age}岁)info{name:张三,age:20}person(**info)# 等价于 person(name张三, age20)综合示例deffunc(a,b,*args,**kwargs):print(fa{a}, b{b})print(fargs{args})# 多余的位置参数print(fkwargs{kwargs})# 多余的关键字参数func(1,2,3,4,5,x10,y20)# a1, b2# args(3, 4, 5)# kwargs{x: 10, y: 20}三、递归函数的循环理解递归三要素deffactorial(n):# 1. 基本情况终止条件ifn1:return1# 2. 递归调用向基本情况靠近# 3. 返回值处理returnn*factorial(n-1)理解递归调用栈defcountdown(n):ifn0:print(结束)else:print(f当前值{n})countdown(n-1)# 递归调用print(f返回层{n})countdown(3)# 输出# 当前值3# 当前值2# 当前值1# 结束# 返回层1# 返回层2# 返回层3四、类与对象的关系比喻理解类 设计图纸描述对象 根据图纸建造的房子具体实例# 类描述学生这类事物的共同特征classStudent:# 类属性所有学生共享的属性schoolXX大学def__init__(self,name,age):# 实例属性每个学生特有的self.namename# 实例属性self.ageage# 实例属性# 对象具体的学生stu1Student(张三,20)# stu1是一个对象stu2Student(李四,21)# stu2是另一个对象五、类成员 vs 实例成员关键区别classMyClass:# 类属性所有实例共享class_attr我是类属性def__init__(self,value):# 实例属性每个实例独有self.instance_attrvalue# 实例方法操作实例属性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) # 错误不能访问实例属性# 测试obj1MyClass(对象1)obj2MyClass(对象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修改对象1print(obj1.instance_attr)# 输出修改对象1print(obj2.instance_attr)# 输出对象2不变记忆技巧特征类成员实例成员定义位置类内部方法外部__init__或实例方法内访问方式类名.属性或self.属性self.属性存储位置类对象中实例对象中修改影响影响所有实例只影响当前实例内存消耗一份所有实例共享每个实例单独存储练习建议写代码验证创建类修改类属性和实例属性观察变化画图理解画出类和对象的内存关系图实际应用用类表示现实事物如学生、汽车需要我针对某个点进一步解释吗