本学习笔记为阿里云天池龙珠计划python训练营的学习内容,学习链接为:天池龙珠计划python训练营
学习内容:
python训练巩固基础:
- 函数
- lambda-表达式
- 类与对象
- 魔法方法
函数:
函数定义
定义函数对象一般形式如下:
函数定义关键词为def;
函数定义内容以缩进格式区分;
return 表示结束函数,并选择性地返回一个值给调用方。可以省略return语句,默认return None
def by_order():
return 5
函数调用
定义好的函数,直接用函数名调用使用
def by_order():
return 5
f=by_order()
print(f) #out:5
函数文档
def Mytxt(xname):
"函数定义时xname是一个形参"
print('传递进来的{}叫做实参,因为传进来是具体的参数值!'.format(xname))
Mytxt('by order of the peaky blinder')
#传递进来的by order of the peaky blinder叫做实参,因为传进来是具体的参数值!
print(Mytxt.__doc__)
#函数定义时xname是形参
help(Mytxt)
函数参数
函数具有很多样的参数形态,既能简单调用,又能传入非常复杂的参数。
简单–>复杂
- 位置参数
- 默认参数
- 可变参数
- 关键字参数
- 命名关键字参数
- 参数组合
- 位置参数、默认参数、可变参数
def functionname(arg1,arg2=v,*args,*,nkw,**kwargs,):
'函数文档字符串'
functionsuite
return [expression]
'''
arg1 位置参数,在调用函数时位置要固定
arg2=v 默认参数,在调用函数时如果没传值,则是默认值;默认参数要在位置参数后面,不然会报错;如果调用参数时,位置顺序有变,则要用参数名称传入参数值
*arg 可变参数,传入的个数是可变的,不定长参数,自动组装成元组,加了*的变量名会存放所有未命名的参数
**kwargs 关键字参数,不定长参数,自动组装为字典
*nkw 命名关键字参数,用户想输入的关键字参数,定义方式是在nkw前面加个*,
'''
functionname(7,8,9,10,nkw=9.9,a=1,b=1) # args==(9,10),kwargs=={'a'=1,'b'=2},nkw==10
- 变量作用域
定义在函数内部的变量拥有局部作用域,称为局部变量
定义在函数内部的变量拥有全局作用域,称为全局变量
局部不按量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问
def function_1(price, rate):
final_price = price * rate
return final_price
old_price = float(input('请输入原价:')) # 98
rate = float(input('请输入折扣率:')) # 0.9
new_price = discounts(old_price, rate)
print('打折后价格是:%.2f' % new_price) # 88.20
当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了
num = 1
def fun1():
global num # 需要使用 global 关键字声明
print(num) # 1
num = 123
print(num) # 123
fun1()
print(num) # 123
- 内嵌函数
def outer():
print('outer函数在这被调用')
def inner():
print('inner函数在这被调用')
inner() # 该函数只能在outer函数内部被调用
outer()
# outer函数在这被调用
# inner函数在这被调用
- 闭包
闭包是一种特殊的内嵌函数;如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包;通过闭包可以访问外层非全局作用域的变量,这个作用域称为闭包作用域。
闭包的返回值一般是函数
用nonlocal关键字修改闭包中的变量。
def funX(x):
num=5
def funY(y):
nonlocal num
num=10
return x * y * 10
return funY
i = funX(8)
print(type(i)) # <class 'function'>
print(i(5)) # 400
- 递归
如果一个函数在内部调用函数本身,则这是递归函数
列表索引/切片
列表索引
a=[1,3,5,7]
a[2] #5
列表切片
切片格式为[起点:终点:步长]
a=[1,3,5,7]
a[::-1] #[1,7,5,3]
Lambda表达式
匿名函数
函数有两种:
- 第一种:用def函数定义的普遍函数
- 第二种:用lambda关键词定义的匿名函数
匿名函数语法结构:
lambda arg_list:expression
argument_list 函数参数,可以是def函数里参数函数类型一样。
odd = lambda x: x % 2 == 1
类与对象
对象=属性+方法
对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。
封装:信息隐蔽技术
用class关键字来定义类 class 类名():
继承
class 类名(父类名):
class Animal:
def run(self):
raise AttributeError('子类必须实现这个方法')
class People(Animal):
def run(self):
print('人正在走')
class Pig(Animal):
def run(self):
print('pig is walking')
class Dog(Animal):
def run(self):
print('dog is running')
def func(animal):
animal.run()
func(Pig())
# pig is walking
多态
不同的对象对同一方法的不同实现
class Animal:
def run(self):
raise AttributeError('子类必须实现这个方法')
class People(Animal):
def run(self):
print('人正在走')
class Pig(Animal):
def run(self):
print('pig is walking')
class Dog(Animal):
def run(self):
print('dog is running')
def func(animal):
animal.run()
func(Pig())
# pig is walking
魔法方法
魔法方法总是被双下划线包围,eg: __init__
魔法方法是面向对象的python的一切,总能够在适当的时候被自动调用。
魔法方法的第一个参数为cls(类方法)或self(实例方法)
cls:代表一个类的名称
self:代表一个实例对象的名称
基本魔法方法
__init__
(self[, …]) 构造器,当一个实例被创建的时候调用的初始化方法
__new__
(cls[, …]) 在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__。
__new__
至少要有一个参数cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init__。
__new__
对当前类进行了实例化,并将实例返回,传给__init__
的self。但是,执行了__new__,并不一定会进入__init__
,只有__new__返回了,当前类cls的实例,当前类的__init__才会进入。
若__new__
没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行,将没有__init__
被调用。
__new__
方法主要是当你继承一些不可变的 class 时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。
__del__(self)
析构器,当一个对象将要被系统回收之时调用的方法。
__str__(self)
:
当你打印一个对象的时候,触发__str__
当你使用%s格式化的时候,触发__str__
str强转数据类型的时候,触发__str__
__repr__(self)
:
repr是str的备胎
有__str__
的时候执行__str__,没有实现__str__的时候,执行__repr__
repr(obj)内置函数对应的结果是__repr__的返回值
当你使用%r格式化的时候 触发__repr__
__str__(self)
的返回结果可读性强。也就是说,str 的意义是得到便于人们阅读的信息,就像下面的 ‘2019-10-11’ 一样。
__repr__(self)
的返回结果应更准确。怎么说,repr 存在的目的在于调试,便于开发者使用