开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2023.03.21广东
Python语言特点:
懒人模式,安装提示里勾选上自动配置环境变量,pip等,安装完成后,你连环境变量都不用配置了。
但是学习的人还是要谦虚一点,配环境变量也是基本功。
“Python.exe”所在的文件夹C:\Python\Python36-32加入的环境变量的Path下面就好了
配置完成后cmd终端里检查一下,如下图没有保错,说明配置正确。
对缩进要求严格,四个空格,不建议用Tab,不同平台上缩进不一样
我使用的IDE为Pycharm,注释为ctrl+/
一张图概况Python学习(转自W3Cschool)
(1)打印出helloworld
(2)注释
(3)数据类型
(4)运算
(5)输入
(6)输出
(7)序列
(8)相等比较
(9)选择
(10)循环
(11)字典(dict)
(12)集合(set)(不常用)
(14)pass,del,exec,eval
(15)内建函数
(1)文件
(2)错误和异常
(3)模块和包
(4)作用域
(5)高阶函数
(6)装饰器
(7)参数
(8)面向对象
(9)定制类(魔术方法)
(11)数学与随机数
(12)正则表达式
1、(单行注释)以#开头,后面的文字直到行尾都算注释
3、(中文注释)要注释中文必须程序开头先写上#-*-coding:utf-8-*-,不然会报错
2、这里的var=xxxx不叫变量赋值,而叫变量绑定,一个符号可以绑定任意类型的值。
3、内置函数type(),用以查询变量的类型
5、布尔型(True,False,可以用and,or,not运算,而不是C语言的&&和||)
6、多变量赋值
1、加、减、乘、除、求余、乘方
2、乘方**右结合
2**3=82**2**3=256(2**2)**3=643、整数运算结果仍然是整数,浮点数运算结果仍然是浮点数。
但是整数和浮点数混合运算的结果就变成浮点数了。
4、字符串与整数相乘
要解释上述结果,又涉及到and和or运算的一条重要法则:短路计算。
①在计算aandb时,如果a是False,则根据与运算法则,整个结果必定为False,因此返回a;如果a是True,则整个计算结果必定取决与b,因此返回b。
②在计算aorb时,如果a是True,则根据或运算法则,整个计算结果必定为True,因此返回a;如果a是False,则整个计算结果必定取决于b,因此返回b。
所以Python解释器在做布尔运算时,只要能提前确定计算结果,它就不会往后算了,直接返回结果。
6、不支持自加(i++)和自减(i--)
7、地板除(//)除法不管操作数何种数值类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字。
print5//3#1print1.0//2.0#0.0print-1/2#-1(5)输入
1、由此可见,input()在对待纯数字输入返回所输入的数字的类型(int,float)
而raw_input()将所有输入作为字符串看待,返回字符串类型。
为了避免类型发生错误,一般情况下使用raw_input()来与用户交互。
1、Python2里面print可以直接接字符串或者运算。
2、Python3里面print变成了一个函数,上面的写法不支持了,必须用一个括号括起来,否则会报告语法错误。
3、>>>是Python解释器的提示符,不是代码的一部分。
4、print语句也可以跟上多个字符串,用逗号“,”隔开,遇到逗号“,”会输出一个空格:
6、转义
%s表示由一个字符串来替换,%d表示由一个整数来替换,%f表示由一个浮点数来替换。
Python非常灵活,即使将数字传递给%s,也不会像其他要求严格的语言一样引发严重后果。
1、序列有两种:list(可变列表)和tuple(不可变元组)
2、定义:序列是一组有顺序的元素的集合,可以包含一个或多个元素,也可以没有任何元素。
list=[0,1,2,3,4,5]#列表用中括号,可改变,理解为数组tuple=(0,1,2,3,4,5)#元祖用小括号,不可改变由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型
2、序列的通用操作
记住倒数第一个元素的索引是-1。倒序切片包含起始索引,不包含结束索引。
3、可变的列表(list)
list=[0,1,2,3,4,5]list.append(7)#append()总是把新元素添加到list的尾部printlist#[0,1,2,3,4,5,7]list.insert(0,-1)#insert()接受两个参数,第一个是索引,第二个是元素printlist#[-1,0,1,2,3,4,5,7]list.insert(-1,6)#insert(-1)是最后一个元素之前,即倒数第二个元素,因为insert()前插printlist#[-1,0,1,2,3,4,5,6,7]list.pop()#pop()方法总是删掉最后一个元素printlist#[-1,0,1,2,3,4,5,6]list.pop(0)#参数为索引printlist#[0,1,2,3,4,5,6]list[6]=7#对list中的某一个索引赋值,就可以直接用新的元素替换掉原来的元素printlist#[0,1,2,3,4,5,7]list[0],list[-1]=list[-1],list[0]#第一与最后位置调换printlist#[7,1,2,3,4,5,0]在使用可变对象的方法如sort(),extend()和reverse()的时候要注意,这些操作会在列表
中原地执行操作,也就是说现有的列表内容会被改变,但是没有返回值!
4、不可变的元组(tuple)
字符串是一种特殊的元组
没有append()方法,也没有insert()和pop()方法,也不能赋值
Tuple比list操作速度快.如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用tuple代替list.如月份,星期。
print(1,)#一个元素的元祖。
因为()既可以表示tuple,又可以作为括号表示运算时的优先级,结果(1)被Python解释器计算出结果1,导致我们得到的不是tuple,而是整数1。正是因为用()定义单元素的tuple有歧义,所以Python规定,单元素tuple要多加一个逗号“,”,这样就避免了歧义。
可变的元组:tuple的元素指向list,而list内的值可变
5、序列解包
#==和is的差别,==比较的是值,is比较的是引用。x=[1,2,3]y=xz=[1,2,3]print(x==y)#Trueprint(x==z)#Trueprint(xisy)#Trueprint(xisz)#False(9)选择
1、Python代码的缩进规则。具有相同缩进的代码被视为代码块
2、缩进请严格按照Python的习惯写法:4个空格,不要使用Tab,更不要混合Tab和空格
3、格式
If后面不需要括号,但是条件后面需要冒号
elif即elseif
4、三元运算符
x,y=4,3ifx 1、for循环依次把list或tuple的每个元素迭代出来 格式 name这个变量是在for循环中定义的,意思是,依次取出list中的每一个元素,并把元素赋值给name,然后执行for循环体(就是缩进的代码块) 2、while循环,不会迭代list或tuple的元素,而是根据表达式判断循环是否结束。 3、中断循环break和continue 4、range()的用法 range(1,5)#代表从1到5(不包含5)[1,2,3,4]range(1,5,2)#代表从1到5,间隔2(不包含5)[1,3]range(5)#代表从0到5(不包含5)[0,1,2,3,4]5、Python中,迭代永远是取出元素本身,而非元素的索引。 对于有序集合,元素确实是有索引的。使用enumerate()函数拿到索引 使用enumerate()函数,我们可以在for循环中同时绑定索引index和元素name。但是,这不是enumerate()的特殊语法。实际上,enumerate()函数把: 变成了类似: 因此,迭代的每一个元素实际上是一个tuple: 6、好用的zip()方法 forx,yinzip(range(1,10),range(1,10)):print(x,y)#结果#(1,1)#(2,2)#(3,3)#(4,4)#(5,5)#(6,6)#(7,7)#(8,8)#(9,9)7、列表生成式,非常简洁 要生成[1x1,2x2,3x3,...,10x10] 列表生成式的for循环后面还可以加上if判断。例如: print[x*xforxinrange(1,11)ifx%2==0]#[4,16,36,64,100]8、迭代器 它为类序列对象提供了一个类序列的接口。 迭代非序列集合(例如映射和文件)时,可以创建更简洁可读的代码。 1、字典的元素没有顺序。你不能通过下标引用元素。字典是通过键来引用,用大括号 查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。 dict的缺点是占用内存大,还会浪费很多内容 dict是按key查找,所以,在一个dict中,key不能重复 作为key的元素必须不可变 2、已知两个列表,一个是名字,一个是成绩,要根据名字找到对应的成绩用两个list不方便,如果把名字和分数关联起来,组成类似的查找表,即Python中的dict 用dict表示“名字”-“成绩”的查找表如下: 4、花括号{}表示这是一个dict,然后按照key:value,写出来即可。最后一个key:value的逗号可以省略。 5、由于dict也是集合,len()函数可以计算任意集合的大小: printlen(d)#运算结果为3 一个key-value算一个,因此,dict大小为3。 6、可以简单地使用d[key]的形式来查找对应的value,这和list很像,不同之处是,list必须使用索引返回对应的元素,而dict使用key: 注意:通过key访问dict的value,只要key存在,dict就返回对应的value。如果key不存在,会直接报错:KeyError。 要避免KeyError发生,有两个办法: 一是先判断一下key是否存在,用in操作符: 二是使用dict本身提供的一个get方法,在Key不存在的时候,返回None: 8、循环调用 forkeyind:#或forkeyind.keys()printd[key]#结果#99#85#95#599、字典的常用方法 10、cmp()比较 (1)先比较字典长度 (2)再比较字典的键 (3)最后比较字典的值 (4)都一样就相等 1、dict的作用是建立一组key和一组value的映射关系,dict的key是不能重复的。 有的时候,我们只想要dict的key,不关心key对应的value,目的就是保证这个集合的元素不会重复,这时,set就派上用场了。 2、set持有一系列元素,这一点和list很像,但是set的元素没有重复,而且是无序的,这点和dict的key很像。 3、创建set的方式是调用set()并传入一个list,list的元素将作为set的元素: (13)函数 1、定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。 3、函数返回多个值 其实这只是一种假象,Python函数返回的仍然是单一值,是一个tuple: 但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值,所以,Python的函数返回多值其实就是返回一个tuple,但写起来更方便。 4、在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 deffact(n):ifn==1:return1returnn*fact(n-1)printfact(10)#计算10的阶乘5、定义函数的时候,还可以有默认参数。 由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面: 6、一个函数能接受任意个参数,我们就可以定义一个可变参数: 7、基本数据类型的参数:值传递 表作为参数:指针传递 1、pass语句 pass代表该语句什么都不做,因为python中空代码是非法的,比如一个if语句要求什么内容都不做,我们就可以使用pass语句。 2、del语句 一般来说python会删除那些不在使用的对象(因为使用者不会再通过任何变量或者数据结构引用它们) 3、exec语句(运行字符串中的程序) 4、eval函数(会计算python表达式(以字符串形式书写),并且返回结果) 1、cmp(obj1,obj2)比较obj1和obj2,根据比较结果返回整数i: 如果是用户自定义对象,cmp()会调用该类的特殊方法__cmp__() 2、str()强制转换成字符串 3、type():详见(3)数据类型-3、 4、help():通过用函数名作为help()的参数就能得到相应的帮助信息 5、isinstance(变量名,类型):判断是否是这个类型的元素,可以用if语句 6、abs():取绝对值 7、enumerate():详见(10)循环-5、 8、len(seq):返回seq的长度 9、sorted(iter):排序,会调用cmp() 10、zip(a1,a2……):详见(10)循环-6、 11、range():详见(10)循环-4、 12、string.lower():转换字符串中所有大写字符为小写 13、string.upper():转换字符串中所有小写字符为大写 14、string.strip():删去字符串开头和结尾的空格 15、string.capitalize():把字符串第一个字符大写 16、string.title():所有单词都以大写开头 17、max()和min():找出最大和最小值 18、sum():求和 19、reversed():倒序输出 Python进阶语法: 1、文件也是一个对象。 2、打开文件 f=open(文件名,模式) 文件名可以是相对路径或者绝对路径 4、关闭close() write()方法可将任何字符串写入一个打开的文件。 主动调用close()写缓存同步到磁盘,或者写入数据量大于或等于写缓存,写缓存同步到磁盘 6、读取read()、readline()、readlines() read(size)方法从一个打开的文件中读取一个字符串。size若不填则为尽量多的字符串,若填了则为结束位置。 tell()方法告诉你文件内的当前位置;即下一次的读写会发生在文件开头这么多字节之后: seek(offset[,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。 8、重命名 Python的os模块提供了帮你执行文件处理操作的方法,必须先导入它,才可以调用。 os.rename(当前文件名,新的文件名) 9、删除文件 同样需要导入os模块,才可以调用。 os.remove(文件名) 1、错误类型 OverflowError数值运算超出最大限制 ZeroDivisionError除(或取模)零(所有数据类型) AttributeError对象没有这个属性 IOError输入/输出操作失败 IndexError序列中没有此索引(index) SyntaxErrorPython语法错误 TypeError对类型无效的操作 ValueError传入无效的参数 2、try-except处理异常 try-except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。 except若不带任何异常类型,即捕获所有发生的异常。但是不能捕获语法错误异常,如ifa,因为是运行前错误而不是运行时错误 也可带多种类型except(Exception1[,Exception2[,...ExceptionN]]]): 错误类型后面跟着变量e,可以print错误提示 案例如下 语句是否发生异常都将执行最后的代码。将异常保留下来交给系统处理,本身不处理异常。 作用:为处理异常事件提供清理机制,用来关闭文件或者释放系统资源。 可以使用except语句或者finally语句,但是两者不能同时使用。else语句也不能与finally语句同时使用。 4、try-except-finally 若try语句没有捕获异常,执行完try代码段后,执行finally 若try捕获异常,首先执行except处理异常,然后执行finally 5、try-except-else-finally 若try语句没有捕获异常,执行完try代码段后,执行else代码段,最后执行finally 若try捕获异常,首先执行except处理错误,然后执行finally 6、try-finally-except 当在try块中抛出一个异常,立即执行finally块代码。 finally块中的所有语句执行后,异常被再次提出,并执行except块代码。 7、with语句 用来代替try-except-finally语句,使代码更加简洁 withcontext[asvar]:with_suitecontext表达式返回是一个对象 var用来保存context返回对象,单个返回值或元组 with_suite使用var变量对context返回对象进行操作 1、打开1.txt文件 2、f变量接收文件对象返回的对象 3、with中的代码执行完成后,关闭文件 程序使用了上下文管理器(with...as...)。上下文管理器有隶属于它的程序块。当隶属的程序块执行结束的时候(也就是不再缩进),上下文管理器自动关闭了文件 运用情况:①文件操作②进城之间互斥操作:例如互斥锁③支持上下文的其他对象 8、raise主动抛出异常 断言语句:assert语句是用于检测表达式是否为真,如果为假,引发AssertionError错误 1、概念介绍 #test.py自身模块名test importp1.util引用p1包的模块util printp1.util.f(2)调用p1.util的函数f() 如何区分包和普通目录包下面有个__inti__.py文件 2、如果我们只希望导入用到的math模块的某几个函数,而不是所有函数,可以用下面的语句: frommathimportpow,sin,log3、可以给函数起个“别名”来避免冲突:as 4、如果导入的模块不存在,Python解释器会报ImportError错误: 5、第三方模块管理系统 -easy_install -pip(推荐,已内置到Python2.7.9) 1、函数作用域LEGBL>E>G>B L:local函数内部作用域 E:enclosing函数内部与内嵌函数之间,即闭包 G:global全局作用域 B:bulid-in内置作用域list,tuple之类 1、由于参数x,y和f都可以任意传入,如果f传入其他函数,就可以得到不同的返回值。 2、map()映射 map()是Python内置的高阶函数,它接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并返回。 deff(x):returnx*xprintmap(f,[1,2,3,4,5,6,7,8,9])#[1,4,9,16,25,36,49,64,81]利用map()函数,可以把一个list转换为另一个list,只需要传入转换函数。 由于list包含的元素可以是任何类型,因此,map()不仅仅可以处理只包含数值的list,事实上它可以处理包含任意类型的list,只要传入的函数f可以处理这种数据类型。 3、reduce()折叠 reduce()函数接收的参数和map()类似,一个函数f,一个list,但reduce()传入的函数f必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。 reduce()还可以接收第3个可选参数,作为计算的初始值。 4、filter()过滤 filter()函数接收一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回True或False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。 defis_odd(x):#是奇数returnx%2==1printfilter(is_odd,[1,4,6,7,9,12,17])#[1,7,9,17]利用filter(),可以完成很多有用的功能,例如,删除None或者空字符串: 5、sorted():对list进行排序 printsorted([36,5,12,9,21])#[5,9,12,21,36]但sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素x,y,如果x应该排在y的前面,返回-1,如果x应该排在y的后面,返回1。如果x和y相等,返回0。 6、Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数! 在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问: 7、闭包(closure) 内部函数中引用了外层函数的变量(enclosing作用域的变量),然后返回内层函数的情况。 闭包的作用是封装和代码复用。 传递的是参数 正确使用闭包,就要确保引用的局部变量在函数返回后不能变。 返回函数不要引用任何循环变量,或者后续会发生变化的变量。 #希望一次返回3个函数,分别计算1x1,2x2,3x3:defcount():fs=[]foriinrange(1,4):deff():returni*ifs.append(f)returnfsf1,f2,f3=count()printf1(),f2(),f3()#999#当count()函数返回了3个函数时,这3个函数所引用的变量i的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算i*i,当f1被调用时,才计算i*i,但现在i的值已经变为3#正确如下defcount():fs=[]foriinrange(1,4):deff(j):defg():returnj*jreturngr=f(i)fs.append(r)returnfsf1,f2,f3=count()printf1(),f2(),f3()#1498、匿名函数lambda 通过对比可以看出,匿名函数lambdax:x*x实际上就是: deff(x): returnx*x 关键字lambda表示匿名函数,冒号前面的x表示函数参数。 匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。 使用匿名函数,可以不必定义函数名,直接创建一个函数对象,很多时候可以简化代码: printsorted([1,3,9,5,0],lambdax,y:-cmp(x,y))#[9,5,3,1,0]返回函数的时候,也可以返回匿名函数: 1、decorator本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。 使用decorator用Python提供的@语法,这样可以避免手动编写f=decorate(f)这样的代码。 2、装饰器用来装饰函数,返回一个函数对象 被装饰函数标识符指向返回的函数对象 4、@log的定义 5、要让@log自适应任何参数定义的函数,可以利用Python的*args和**kw,保证任意个数的参数总是能正常调用: 可变参数*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前。 所以,带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数: 而且wrapper(*args,**kw)要调用外层参数prefix,所以无法拆开 9、当一个函数有很多参数时,调用者就需要提供多个参数。如果减少参数个数,就可以简化调用者的负担。 比如,int()函数可以把字符串转换为整数,当仅传入字符串时,int()函数默认按十进制转换: 但int()函数也提供额外的base参数,默认为10。如果传入base参数,就可以做N进制转换: functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2: 1、位置参数必须以在被调用函数中定义的准确顺序来传递,参数数目必须一致。 2、所有必需的参数都要在默认参数之前。 3、如果命名了参数,这里可以不按顺序给出参数。 func(*tuple_grp_nonkw_args,**dict_grp_kw_args) 其中的tuple_grp_nonkw_args是以元组形式体现的非关键字参数组,dict_grp_kw_args是装有关键字参数的字典。 5、可变长的参数元组必须在位置和默认参数之后。 6、关键字变量参数(Dictionary) 在我们有不定数目的或者额外集合的关键字的情况中,参数被放入一个字典中,字典中键为参数名,值为相应的参数值。 #收集命名参数 deffunc_with_collection_rest_naned_parameters(*args,**kw): print(args) print(kw) func_with_collection_rest_naned_parameters(1,2,3,x=4,y=5,z=6) #这会导致args[0]指向第一个实参,args[1]指向第二个实参。 #{} #这里的执行相当于func_with_collection_rest_naned_parameters(1,2,3,x=4,y=5,z=6)。 1、类通过class关键字定义。类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。 类也要细致命名,像“AddrBookEntry”,“RepairShop”等等就是很好的名字 Python并不支持纯虚函数(像C++)或者抽象方法(如在JAVA中) classPerson(object): pass 2、有了Person类的定义,就可以创建出具体的xiaoming、xiaohong等实例。创建实例使用类名+(),类似函数调用的形式创建: Python规范推荐使用骆驼记法的下划线方式,比如,“update_phone”“update_email”。 xiaoming=Person() xiaohong=Person() 3、由于Python是动态语言,对每一个实例,都可以直接给他们的属性赋值: 4、构造函数__init__()方法 def__init__(self,name,gender,birth): self.name=name self.gender=gender self.birth=birth __init__()方法的第一个参数必须是self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。 相应地,创建实例时,就必须要提供除self以外的参数: 定义Person类的__init__方法,除了接受name、gender和birth外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。 要定义关键字参数,使用**kw; 由于Python具有垃圾对象回收机制(靠引用计数),这个函数要直到该实例对象所有的引用都被清除掉后才会执行。所以很少用到。 def__init__(self,……): 6、Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。 7、类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问: 当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。而其他不变 9、访问类的属性 有两种方法。最简单的是使用dir()内建函数。另外是通过访问类的字典属性__dict__,这是所有类都具备的特殊属性之一。 10、实例的方法。 实例的方法就是在类中定义的函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:在其他语言中,self就是this. 在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过方法调用获得,这种数据封装的形式除了能保护内部数据一致性外,还可以简化外部调用的难度。 11、方法也分实例方法和类方法。 @classmethod调用的时候用类名而不是某个对象 在class中定义的全部是实例方法,实例方法第一个参数self是实例本身。 要在class中定义类方法,需要这么写: 因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用 12、@property像访问属性一样调用方法,即不用括号 get/set方法: 把一个getter方法变成属性,只需要加上@property就可以了 setter是关键字,这种“@+方法名字+点+setter”是个固定格式与@property搭配使用。 13、函数和方法 函数是直接调用函数名,仅仅是一部分代码 方法必须和对象结合在一起使用,是类的一部分 方法可以看做是类的属性 一定要用super(Student,self).__init__(name,gender)去初始化父类,否则,继承自Person的Student将没有name和gender。 函数super(Student,self)将返回当前类继承的父类,即Person,然后调用__init__()方法,注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写) 使用super()的漂亮之处在于,你不需要明确给出任何基类名字,这意味着如果你改变了类继承关系,你只需要改一行代码(class语句本身)而不必在大量代码中去查找所有被修改的那个类的名字。 一个实例可以看成它本身的类型,也可以看成它父类的类型。 15、多重继承 多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。 举个例子,Python的网络服务器有TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer,而服务器运行模式有多进程ForkingMixin和多线程ThreadingMixin两种。 要创建多进程模式的TCPServer: classMyTCPServer(TCPServer,ForkingMixin) 要创建多线程模式的UDPServer: classMyUDPServer(UDPServer,ThreadingMixin): 如果没有多重继承,要实现上述所有可能的组合需要4x2=8个子类。 16、多态 用一个类继承多个类,调用同一个方法,会有不同的反应,因为被重写了。 17、鸭子类型 定义:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。 这种风格适用于动态语言(比如PHP、Python、Ruby、Typescript、Perl、Objective-C、Lua、Julia、JavaScript、Java、Groovy、C#等)和某些静态语言 鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。从静态类型语言转向动态类型语言的用户通常试图添加一些静态的(在运行之前的)类型检查,从而影响了鸭子类型的益处和可伸缩性,并约束了语言的动态特性。 鸭子类型比接口更好用。 18、getattr()、setattr()和delattr(): getattr()和setattr()函数相应地取得和赋值给对象的属性, getattr()会在你试图读取一个不存在的属性时,引发AttributeError异常,除非给出那个可选的默认参数。 setattr()将要么加入一个新的属性,要么取代一个已存在的属性。 delattr()函数会从一个对象中删除属性 1、__str__():把一个类的实例变成str __repr__()转换为机器看的字符串,可以由eval()执行 2、比较运算符_cmp__():可以实现对一组Student类的实例排序 __eq__()判断等于,__lt__()判断小于,__gt__()判断大于 3、__len__():返回元素的个数 4、四则运算:__add__(),__sub__(),__mul__(),__div__() 逻辑运算__or__(),__and__() 5、类型转换:__int__(),__float__() 6、__slots__():限制当前类所能拥有的属性,能节省内存 7、__call__(): 在Python中,所有的函数都是可调用对象。 一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。 1、time包基于C语言的库函数(libraryfunctions)。Python的解释器通常是用C编写的,Python的一些函数也会直接调用C语言的库函数。 %y两位数的年份表示(00-99) %Y四位数的年份表示(000-9999) %m月份(01-12) %d月内中的一天(0-31) %H24小时制小时数(0-23) %I12小时制小时数(01-12) %M分钟数(00=59) %S秒(00-59) %a本地简化星期名称 %A本地完整星期名称 %b本地简化的月份名称 %B本地完整的月份名称 %j年内的一天(001-366) %U一年中的星期数(00-53)星期天为星期的开始 %w星期(0-6),星期天为星期的开始 %W一年中的星期数(00-53)星期一为星期的开始 6、获取某月日历 Calendar模块有很广泛的方法用来处理年历和月历,例如打印某月的月历: 8、datetime包 datetime包是基于time包的一个高级包,为我们提供了多一层的便利。 9、其他模块:pytz模块、dateutil模块 math.e#自然常数e math.pi#圆周率pi 2、math包运算 math.ceil(x)#对x向上取整,比如x=1.2,返回2 math.floor(x)#对x向下取整,比如x=1.2,返回1 math.pow(x,y)#指数运算,得到x的y次方 math.log(x)#对数,默认基底为e。可以使用base参数,来改变对数的基地。 math.sqrt(x)#平方根 3、math包三角函数: math.sin(x),math.cos(x),math.tan(x),math.asin(x),math.acos(x),math.atan(x) 这些函数都接收一个弧度(radian)为单位的x作为参数。 角度和弧度互换:math.degrees(x),math.radians(x) 4、random包 1)随机挑选和排序 random.choice(seq)#从序列的元素中随机挑选一个元素 比如random.choice(range(10))#从0到9中随机挑选一个整数。 random.sample(seq,k)#从序列中随机挑选k个元素 random.shuffle(seq)#将序列的所有元素随机排序 2)随机生成实数 random.random()#随机生成下一个实数,它在[0,1)范围内。 random.uniform(a,b)#随机生成下一个实数,它在[a,b]范围内。 5、decimal十进制浮点运算类Decimal 1、匹配字符串 str.startswith()和str.endswith() 或者用切片操作,str[:-1].endswith() 使用单个字符串来描述匹配一系列符合某个句法规则的字符串,是对字符串操作的一种逻辑公式,应用场景在处理文本和数据。 re模块使Python语言拥有全部的正则表达式功能。 3、导入re模块#importre 利用re.compile(正则表达式)返回pattern 利用pattern.match(待匹配字符串)返回match match.group()返回子串 match.string()返回主串 match.span()返回子串在主串中的位置 4、re.match尝试从字符串的开始匹配一个模式。 re.match(pattern,string,flags=0)pattern匹配的正则表达式 string要匹配的字符串 flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等 匹配成功re.match方法返回一个匹配的对象,否则返回None。 5、group(num)或groups()匹配对象函数来获取匹配表达式。 group(num=0)匹配的整个表达式的字符串,group()可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 groups()返回一个包含所有小组字符串的元组。 6、基本匹配符 ①.匹配任意字符(除了\n),一个点只是一个字符 ②[…]匹配字符集如[a-z][A-Z][0-9][a-zA-Z0-9] ③[^…]匹配不在[]中的任意字符 ④\d匹配数字等价于[0-9] ⑤\D匹配非数字 ⑥\s匹配空白,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v] ⑦\S匹配非空白 ⑧\w匹配单词字符,匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_] ⑨\W匹配非单词字符 7、特殊匹配符 ①*匹配前一个字符0次或无限次 ②+匹配前一个字符1次或无限次 ③?匹配前一个字符0次或1次 ④{m}匹配前一个字符m次 ⑤{m,n}匹配前一个字符m到n次 ⑥*或+或匹配模式变为非贪婪(尽可能减少匹配字符) ①^匹配字符串开头 ②$匹配字符串结尾 ③\A指定的字符串必须出现在开头 ④\Z指定的字符串必须出现在结尾 ⑤|或,匹配左右任意一个表达式 ⑥(ab)括号中表达式作为一个分组 ⑦\ ⑧(P ⑨(P=name)引用别名为name的分组匹配字符串 9、其他方式 ①search(pattern,string,flags=0) 会在字符串内查找模式匹配,直到找到第一个匹配 匹配成功re.search方法返回一个匹配的对象,否则返回None ②findall(pattern,string,flags=0) 找到匹配,返回所有匹配部分的列表 ③sub(pattern,repl,string,count=0,flags=0) 将字符串中匹配正则表达式的部分替换为其他值 ④split(pattern,string,maxsplit=0,flags=0) 根据匹配分割字符串,返回分割字符串组成的列表 正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位OR(|)它们来指定。