SHYLearn_Python
3. 格式化输入与输出
3.1 格式化输入
a = input(<info>) a = input(repr(str))
3.2 格式化输出
3.2.1 print语句
print(a, b) 同行以空格隔开输出 print(a, b,s ep=',') 以逗号隔开进行输出 print(s, ewp='\n') 以换行隔开进行输出 print(name, end='!') 每个输出都要添加! print(' i love %s ' % s) print 格式化输出 # 对字符串的每个元素进行换行输出 for item in list: print(item)
3.2.2 字符串方法format()
print('{0} : {1} : {2}'.format(hour, minute, second)) # 按照对齐格式化进行排列 print('{0:3},{1:5}'.format(12, 534)) :后面的内容为只等的格式,表示占位数,如果不够,在前面用空格补齐
3.2.3 数据输出的格式类型
# a表示占位,不够,按照原长度打印,多了左侧空格补齐,小数点后面为保留几位小数,f位数据类型 print('i love %a.bf', num) - b 以二进制形式输出 - c 输出证书值对应的unicode字符 - d 以十进制形式输出数值 - e 以科学计数法形式输出 - o 以八进制形式输出 - x 以小写形式的十六进制输出 - X 以大写形式的十六进制输出
4. 函数
4.1 函数定义及调用函数
- def funname(para1, para2,*,para3...): 函数体 # 在参数列表中使用(*),代表调用函数时,在(*)后面的参数都必须指定参数名称,如下 funname(para1, para2,para3=2...) 调用函数 - def fun(strname, age=32): 后面的参数位默认形参,默认形参必须放在后面 - 对元组和列表进行解包 def fun(*person): fun('shy','21') mylist = ['shy','21'] fun(*mylist) - 对字典进行解包定义参数及调用 def fun(**person) print('姓名',person['name'],'年纪',person['age']) fun('shy','21') mydict = {'name':'shy','age':21} fun(**mydict)
4.2 函数类型
4.2.1 python内置函数
下图python3.8官方文档给出的内置函数库:
官方中文文档的连接:https://docs.python.org/zh-cn/3/library/functions.html
4.2.2 匿名函数与可迭代函数
- 匿名函数
# 匿名函数 lambda para1, para2... : 表达式 r = lambda x,y:x*y # 匿名函数与reduce函数的组合应用 reduce(fun, seq, initial) #用序列值依次调用fun from funtools import reduce a = reduce(lambda x,y:x + y, range(1,101)) #实现求1~100的和 # 匿名函数与map函数的组合应用 map(fun, seq[,seq,]) #将seq内部的元素作为参数依次调用 t = map(lambda x:x**2,[1,2,3,4,5]) #返回一个map对象 print(list(t)) #打印值为[1,4,9,16,25] y =map(lambda x,y:x+y,[1,2,3],[4,5,6]) print(list(t)) # 打印值为[5,7,9] # 匿名函数与filter函数的组合应用 filter(fun or none, seq) #将序列对象依次放到fun中,如果返回true就留下 t = filter(lambda x:x%2==0, [1,2,3,4,5,6]) print(list(t)) # 打印值为[2,4,6]
- 可迭代函数
# 每个生成器对象会有一个__next__()方法 t = filter(lambda x:x%2==0, [1,2,3,4,5,6]) print(t.__next__()) # 打印2 print(t.__next__()) # 打印4
4.2.3 生成器函数与工厂函数
- 生成器函数
# 生成器与迭代器不同,迭代器的内容存在内存里,用next函数遍历,生成器用完立即销毁 def Reverse(data): for idx in range(len(data)-1,-1,-1): yield data[idx] # 生成器函数用yield返回 for c in Reverse('Python'): print(c, end = ' ') # 打印 n o h t y P # 生成器表达式 mylist = [x*x for x in range(3)] # 使用生成器表达式返回一个对象
- 工厂函数
# 闭合函数 def wrapperfun(strname): def recorder(age): print(strname,age) return recorder fun = wrapperfun('shy') fun(37) # 打印 shy 37 # 装饰器属性:在原有的函数包一个函数,不改变原代码的基础上,添加新功能 def checkParams(fn): # 装饰器函数 def wrapper(strname): if isinstance(strname.(str)): return fn(strname) # 判断字符串类型 print ('error') return return wrapper def wrapperfun(strname): def recorder(age): print(strname,age) return recorder wrapperfun2 = checkParams(wrapperfun) fun = wrapperfun('shy') fun(37) # 打印 shy 37 fun = wrapperfun2(37) # 输入不合法
- @修饰符
def checkParams(fn): # 装饰器函数 def wrapper(strname): if isinstance(strname.(str)): return fn(strname) # 判断字符串类型 print ('error') return return wrapper @checkParams # 使用装饰器函数对wrapperfun函数进行修饰 def wrapperfun(strname): def recorder(age): print(strname,age) return recorder fun = wrapperfun('shy') fun(37) # 打印 shy 37 fun = wrapperfun2(37) # 输入不合法
4.4.4 偏函数与递归函数
- 偏函数
# 偏函数是重新定义一个函数,并指定了默认参数值 from funtools import partial partial(fun, *args, **keywords)
- 递归函数
# 递归函数是自己调用自己的函数,所有的函数调用都是压栈的过程,所以耗内存,栈空间有限,如果程序栈空间地址写满,程序最后会崩溃 def fun(n): return n*fun(n-1)
4.4.5 eval 和 exec函数
- eval函数
# exec执行不返回结果,eval执行返回结果 dic = {} dic['b'] = 3 exec('a=4',dic) print(dic.keys()) #打印dict_keys(['a','__builtins__','b']) # 使用这两个函数第一个参数一定是可执行代码
4.3 变量的作用域
4.3.1 global语句
# global 可以把局部声明为全局 a = 6 def func(): global a a = 5 print(a) # 打印5
4.3.2 nonlocal语句
# nonlocal可以把全局往下一作用域调用 a = 6 def func(): a = 7 def nested(): nonlocal a a+=1 nested() print('本地:',a) #打印 8 func() print('全局',a) # 打印6 print(a) # 打印5
5. 面向对象的程序设计
5.1 类的结构
class MyClass: def __init__(self,属性): # 构造函数 self.属性 = 属性 pass def getname(self): return self.name ...... myc = MyClass(属性) # 初始化实例对象,构造函数的属性 a = myc.getname() # 类还具有一些内置属性 __name__ 名称 __doc__ 类的文档字符串 __nodule__ 类的模块 if __name__ == '__main__':
5.2 类方法
@classmthod # 声明为类方法,可以直接用类名进行调用,当然初始化实例对象进行调用也是正确的 def fun(cls): @staticmethod # 等同于普通函数,只是被封装在类中,独立于整个类 def fun() # 同上的调用方式,且参数没有限制要求
5.3 类的私有化属性
# 私有化属性方法,在类的属性前面加双下划线,同时会提供一个私有化属性的访问函数,不可以被修改,但可以针对具体实例进行对象修改 clas MyClass: __Occupation = 'scientist' def __init__(sefl,name,age); def getOccupation(self): return self.__Occupation # 使用装饰器函数实现类的私有化 clas MyClass: __Occupation = 'scientist' def __init__(sefl,name,age); @property # 装饰为属性,使类的私有化属性也可以被访问 def getOccupation(self): return self.__Occupation
5.4 类的继承
5.4.1 继承结构体
class DerivedClass(FatherClass1, FatherClass2): pass
class Record: """ A record class """ __Ocuupation = "scientist" def __init__(self, name, age): self.name = name self.age = age def showrecode(self): print("Occupation:",self.getOccupation()) def getOccupation(self): return self.__Occupation class GirlRecord(Record): """ A girlrecord class """ def showrecode(self): Record.showrecode(self) print("the girl:", self.name, "age:", self.age) myc = GirlRecord("Anaa", 21) myc.showrecode()
5.4.2 super()函数
# 保障了调用父类方法时只调用一次 class Record: """ A record class """ __Ocuupation = "scientist" def __init__(self, name, age): self.name = name self.age = age def showrecode(self): print("Occupation:",self.getOccupation()) def getOccupation(self): return self.__Occupation class GirlRecord(Record): """ A girlrecord class """ def showrecode(self): super().showrecode(self) print("the girl:", self.name, "age:", self.age) class MaleRecord(Record): """ A girlrecord class """ def showrecode(self): super().showrecode(self) print("the girl:", self.name, "age:", self.age) class ThisRecord(GirlRecord, MaleRecord): """ A girlrecord class """ def showrecode(self): super().showrecode(self) print("the girl:", self.name, "age:", self.age) myc = ThisRecord("Anaa", 21) myc.showrecode()
5.5 类相关的内置函数
- 判断实例(isinstance)
isinstance(object, class_name)
- 判断字类(issubclass)
issubclass(class1, class2)
- 判断类实例中是否包含某一个属性(hasattr)
hasattr(object, name)
- 获得类实例中的某一个属性(getattr)
getattr(object, name[,default])
- 设置类实例中的某一个属性值(setattr)
setattr(object, name, value)
5.6 重载运算符
class MyClass: """ A record class""" def __init__(self, name, age): self.name = name self.age = age def __str__(self): # 将值转化为字符串进行输出 retrun "name:"+self.name;"age:"+str(self.age) __repr__ = __str__ # 转化为解释器读取的形式 def __lt__(self, record): #重载比较运算符 if self.age < record.age: return True else: return False def __add__(self, record): #重载加号运算符 return MyClass(self.name, self.age+record.age) myc = MyClass("A", 42) myc1 = MyClass("B", 23) print(repr(myc)) print(myc) print(str(myc)) print(myc<myc1) print(myc+myc1)
- 运算符重载
方法名 运算符和表达式 说明 __add__(self,rhs) self + rhs 加法 __sub__(self,rhs) self - rhs 减法 __mul__(self,rhs) self * rhs 乘法 __truediv__(self,rhs) self / rhs 除法 __floordiv__(self,rhs) self //rhs 地板除 __mod__(self,rhs) self % rhs 取模(求余) __pow__(self,rhs) self **rhs 幂运算 合赋值算术运算符的重载: 方法名 运算符和表达式 说明 __iadd__(self,rhs) self += rhs 加法 __isub__(self,rhs) self -= rhs 减法 __imul__(self,rhs) self *= rhs 乘法 __itruediv__(self,rhs) self /= rhs 除法 __ifloordiv__(self,rhs) self //=rhs 地板除 __imod__(self,rhs) self %= rhs 取模(求余) __ipow__(self,rhs) self **=rhs 幂运算 比较算术运算符的重载: 方法名 运算符和表达式 说明 __lt__(self,rhs) self < rhs 小于 __le__(self,rhs) self <= rhs 小于等于 __gt__(self,rhs) self > rhs 大于 __ge__(self,rhs) self >= rhs 大于等于 __eq__(self,rhs) self == rhs 等于 __ne__(self,rhs) self != rhs 不等于 位运算符重载 方法名 运算符和表达式 说明 __and__(self,rhs) self & rhs 位与 __or__(self,rhs) self | rhs 位或 __xor__(self,rhs) self ^ rhs 位异或 __lshift__(self,rhs) self <<rhs 左移 __rshift__(self,rhs) self >>rhs 右移 反向位运算符重载 方法名 运算符和表达式 说明 __and__(self,lhs) lhs & rhs 位与 __or__(self,lhs) lhs | rhs 位或 __xor__(self,lhs) lhs ^ rhs 位异或 __lshift__(self,lhs) lhs <<rhs 左移 __rshift__(self,lhs) lhs >>rhs 右移 复合赋值位相关运算符重载 方法名 运算符和表达式 说明 __iand__(self,rhs) self & rhs 位与 __ior__(self,rhs) self | rhs 位或 __ixor__(self,rhs) self ^ rhs 位异或 __ilshift__(self,rhs) self <<rhs 左移 __irshift__(self,rhs) self >>rhs 右移 一元运算符的重载 方法名 运算符和表达式 说明 __neg__(self) - self 负号 __pos__(self) + self 正号 __invert__(self) ~ self 取反
来源:CSDN
作者:九号店
链接:https://blog.csdn.net/weixin_44578032/article/details/103243327