概念术语

我的梦境 提交于 2019-11-27 06:10:10

1. 格式化输出:利用format "{1} {0} {1}".format("hello", "world") # 设置指定位置 'world hello world' 或 %s,%d % str1,int1
* format的四种玩法(python推荐使用format做格式化输出)

```python
# 第一种 按位置占位 跟%s原理一致
str1 = 'my name is {}, my age is {}'.format(18,'age')
print(str1)
# 第二种 按索引占位
str1 = 'my name is {1}, my age is {0}'.format('egon',18)
print(str1)
# 第三种 指名道姓占位(关键字传参)
str1 = 'my name is {name}, my age is {age}'.format(name='egon',age=18)
print(str1)
#第四种 format简写,两个变量进行拼接时用
name='egon'
age=18
str1 = f'my name is {name}, my age is {age}'
print(str1)
```

2. 形参 实参 位置参数 关键字参数 默认参数
形参: def func(arg1,arg2) arg1,arg2即为形参
实参:真实传给函数的参数
位置参数:按位置,一个一个传的那几个参数
关键字参数:arg1=x这么传的参数 就叫位置参数
默认参数: 不传 也有默认值的参数

3. 闭包函数:
定义在函数内部的函数
并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数

4. 迭代:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来

5.可迭代的对象:在python中,但凡内置有__iter__方法的对象,都是可迭代的对象

6. 迭代器:迭代取值工具,可迭代的对象执行__iter__方法得到的返回值就是迭代器对象
```
可迭代的对象:str,list,tuple,dict,set,file
1、获取可迭代对象的方式:无须获取,python内置str,list,tuple,dict,set,file都是可迭代对象
2、特点:
内置有__iter__方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象

迭代器对象:文件对象本身就是迭代器对象
1、获取迭代器对象的方式:
执行可迭代对象的__iter__方法,拿到的返回值就是迭代器对象
2、特点:
内置有__next__方法,执行该方法会拿到迭代器对象中的一个值
内置有__iter__方法,执行该方法会拿到迭代器本身
```
```
for循环原理分析:
for 循环称之为迭代器循环,in后跟的必须是可迭代的对象
for循环会执行in后对象的__iter__方法,拿到迭代器对象
然后调用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体
周而复始,直到取值完毕,for循环会检测到异常自动结束循环
```
7. 生成器
包含 ' yield '关键字, yield可以保存函数执行的状态
例 x = yield y
必须初始化一次,让函数停在yield的位置
之后每send(参数)一次,yield把值赋给x循环一圈 又停在yield的位置(同__next__的功能,但send独有)

8. 函数递归:函数的递归调用,即在函数调用的过程中,又直接或间接地调用了函数本身

9. 序列化 反序列化:利用json pickle shelve模块,把字典 转成 字符串信息 (pickle以二进制处理)

10. 派生:继承某个父类,定义这个类的时候,父类没有的新属性或新方法叫 派生属性 或 派生方法

11. 经典类 新式类 :继承自object的类即为新式类,python3全是新式类

12. 面向对象的三大特性 : 继承 多态 封装

**继承**
```
继承:A类继承自B类
组合:A类的某个属性=B类的对象
什么时候用继承,什么时候用组合
老师类 和 生日类 老师的生日 老师.生日 用组合
老师类 和 人类 老师是人 class老师类(人类) 用继承 另外,有相同属性也可判断要用继承
```
**多态** :一个函数根据传的参数的不同,可实现不同的功能
```python
class Alipay():
def pay(self,money):
print('已经用支付宝支付了%s元' % money)

class Applepay():
def pay(self,money):
print('已经用applepay支付了%s元' % money)

def pay(pay_obj,money): # 统一支付入口 归一化设计
pay_obj.pay(money)

p1=Alipay()
p2=Applepay()
pay(p1,10)
pay(p2,10)
>>>已经用支付宝支付了10元
>>>已经用applepay支付了10元
```
**封装** 把一个包含很多私有属性的类写好做出一个包,并提供外部调用接口

* @property:有的函数的执行结果是返回一个值,比如 面积函数,最后return面积值,若在面积函数前加@property,则可以用 对象.面积 得到面积值 而非 对象.面积()

* @staticmethod:静态方法 没有默认的self参数 就象函数一样,可额外传参数,静态方法与类和对象都没直接关系,但调用需要类或对象调用
不加@staticmethod能不能调用?类名调用可以,对象调用不行,加了@staticmethod后都可以调用
```python
class A:
@staticmethod
def get(x,y): # 静态方法
print(x,y)

A.get(1,2) #类名调用
a1=A()
a1.get(1,2) #对象调用 若不加@staticmethod则报错
```

* @classmethod:类方法, 此方法不依赖对象,调用时直接类调用,且需要传参数
```python
class Goods:
__discount = 0.8
def __init__(self,name,price):
self.name = name
self.__price = price
@property
def price(self):
return self.__price * Goods.__discount
@classmethod # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象
def change_discount(cls,new_discount): # 修改折扣
cls.__discount = new_discount
apple = Goods('苹果',5)
print(apple.price)
Goods.change_discount(0.5) #类方法
print(apple.price)
```
* 对象可以调用类方法和静态方法么? 可以 一般情况下 推荐用类名调用

13. **接口类(多继承)**
@abstractmethod : 规定子类必须要有 多个父类里规定要有的方法,父类方法里内容pass就行了,具体怎么实现,在具体的子类里实现即可
例如tiger类继承自 必须有走方法的类 和 必须有 游方法的类,那么tiger类必须定义走方法和游方法,否则,当tiger实例化时,会报错提醒 少写了某个必要方法


14. **抽象类(单继承)** 多个 实现功能很相近的类
同13,也是规定子类必须有某个方法
父类中可以有一些简单的基础实现

15. 自省 反射:检测一个属性或函数 在对象或类的__dict__中是否存在
```python
hasattr(obj,'属性') #obj.属性 是否存在
getattr(obj,'属性') #有就返回obj.属性 此时还未执行,只是把函数返回 不存在则报错
getattr(obj,'属性','默认值') #获取obj.属性 不存在不会报错,返回那个默认值
setattr(obj,'属性','属性的值') #obj.属性=属性的值
delattr(obj,'属性') #del obj.属性
#注意:反射可以反射类的属性
```

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!