尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python数据类型:函数、类

Python数据类型:函数、类 一、函数基础函数定义def函数名(参数列表): 函数注释 :param 参数1 参数1说明 :param 参数2 参数2说明 :return: 返回值注释 return返回值global用于修改全局变量的值常用在程序的状态、配置、计数等场景中。debug_modeFalsedefenable_debug():globaldebug_mode debug_modeTruedefdisable_debug():globaldebug_mode debug_modeFalse参数传递位置传参调用函数时根据函数定义的位置顺序来传递参数要求顺序一一对应。优点简洁缺点可读性差。关键字传参调用函数时根据形参的名字作为关键字以”键值“的形式来传递参数不要求顺序。优点可读性强缺点臃肿。混合传参位置参数和关键字参数可以同时使用同时使用时必须先使用位置参数再使用关键字参数其中关键字参数部分不要求顺序。当方法参数较少并且参数的顺序也比较自然建议使用位置传参更合适当方法参数较多并且参数容易混淆建议使用关键字参数增加可读性。defadd_user(name,age,gender,city):pass# 纯位置方式调用(严格要求顺序)add_user(melong,30,男,上海)# 纯关键字方式调用不要求顺序add_user(gender男,namemelong,city上海,age30)# 混用位置参数在前关键字参数在后add_user(melong,30,city上海,age30)默认参数的定义必须位于参数列表的最后一部分。defadd_user(name,age,city,countryChina)pass不定长可变参数不定长位置参数在参数名前使用*号标记一般约定俗称的名字为*args, 所有的不定长位置参数都被封装为元祖。适用于不确定参数个数的数据。不定长关键字参数在参数名前使用**号标记一般约定俗成的名字为**kyargs, 所有不定长关键字参数都被封装为字典。适用于不确定的选项如配置参数等。混合不定长参数必须先定义不定长位置参数再定义不定长关键字参数例如rond()。defcalc_avg(*args):returnsum(args)/len(args)deffoo(**kyargs):foriinkyargs:print(i)defcalc_avg(*args,**kwargs):valuesum(args)/len(args)ifkwargs[round]isnotNone:valueround(value,kwargs[round])ifkwargs.get(print):print(favg{value})二、类1. 魔法方法Python中方法名以双下划线__作为前缀和后缀的方法叫做魔法方法魔法方法相当于Java的接口方法具有特定的功能。__new__实例化方法先执行__new__再执行__init__。__init__初始化方法例如给属性初始化None, 如 self.xxx None。__str__toString()方法。__eq__用于比较两个对象是否相等。__next__表示迭代器对应的next()方法。__add__加法运算符 __or__或运算符 |__mul__乘法运算 *如 字符串乘以数字print(“-” * 20)__mod__: 取余self % value常见的字符串拼接print(“name%s age%d” % (name, age))2. self对象方法必须有参数而且第一个参数必须是self。注意self并不是Python的关键字处于习惯大家都默认使用selfJava中使用关键字this。publicclassUser{privateStringname;privateIntegerage;publicUser(Stringname,Integerage){this.namename;this.ageage;}OverridepublicStringtoString(){returnUser{namename\, ageage};}}classUser:def__init__(self,name,age):self.namename self.ageagedef__str__(self):returnfUser(name{self.name}, age{self.age})Python初始化方法init相当于 Java的构造方法只不过不用在最上面声明属性相对来说更简洁。importkeyword# 查看Python中的关键字列表print(keyword.kwlist)3. 访问权限约定Python所提倡的用更多的符号来代替关键字在Java中定义私有变量要使用private关键字。默认是继承object。私有属性在属性名前使用双下划线命名规则。如__password类的私有方法也是在方法名前使用双下划线前缀。如 __set_passwordclassPerson:countryChinadefsay_hello(self):print(Im Chinese)classStudent(Person):nameNoneage0__weight60def__init__(self):passdef__init__(self,name,age):self.namename self.ageagedefsay_hello(self):print(Im Student)def__private_func(self):print(私有函数)def__add__(self,other):returnStudent(self.nameother.name,self.ageother.age)zhangsanStudent(zhangsan,26)zhangsan.say_hello()super(Student,zhangsan).say_hello()lisiStudent(lisi,24)zhanglizhangsanlisiprint(zhangli.age)4. 静态方法和类方法静态方法staticmethod相对于对象方法的区别是第一个参数不需要声明self。类方法classmethod和静态方法的区别是类方法需要显式定义cls参数classPerson:def__init__(self,nameNone,ageNone):self._namename self._ageagestaticmethoddefhello():print(hello)classmethoddefinstance(cls,name,age):returncls(name,age)if__name____main__:# helloPerson.hello()personPerson.instance(张三,30)# 张三print(person._name)5. 抽象方法Python认为一个方法没有方法体即方法体位pass就可以认为是一个抽象方法Python一直在倡导约定大于语法所以也没有提供什么语法强制校验毕竟程序员要对自己写的代码负责。Python虽然没有把抽象方法作为一级语法但是也可以在运行时检测抽象方法有没有实现没有实现就抛异常需要通过abc模块来检查。TypeError: Cant instantiate abstract class Chinese with abstract method hello。Python中只有class关键字没有接口interface关键字Python认为一个类中的所有方法的方法体都是pass那么这个类就算一个接口。fromabcimportABCMeta,abstractmethodclassPerson(metaclassABCMeta):def__init__(self,nameNone,ageNone):self._namename self._ageageabstractmethoddefhello(self):passclassChinese(Person):passif__name____main__:chineseChinese()chinese.hello()
返回列表