Task03 天池龙珠计划训练营python学习笔记

本学习笔记为阿里云天池龙珠计划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)
函数参数

函数具有很多样的参数形态,既能简单调用,又能传入非常复杂的参数。
简单–>复杂

  • 位置参数
  • 默认参数
  • 可变参数
  • 关键字参数
  • 命名关键字参数
  • 参数组合
  1. 位置参数、默认参数、可变参数
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
  1. 变量作用域
    定义在函数内部的变量拥有局部作用域,称为局部变量
    定义在函数内部的变量拥有全局作用域,称为全局变量
    局部不按量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问
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
  1. 内嵌函数
def outer():
    print('outer函数在这被调用')
    def inner():
        print('inner函数在这被调用')
    inner()  # 该函数只能在outer函数内部被调用


outer()
# outer函数在这被调用
# inner函数在这被调用
  1. 闭包

闭包是一种特殊的内嵌函数;如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包;通过闭包可以访问外层非全局作用域的变量,这个作用域称为闭包作用域。
闭包的返回值一般是函数
用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
  1. 递归
    如果一个函数在内部调用函数本身,则这是递归函数
列表索引/切片

列表索引

a=[1,3,5,7]
a[2]	#5

列表切片
切片格式为[起点:终点:步长]

a=[1,3,5,7]
a[::-1]	#[1,7,5,3]

Lambda表达式

匿名函数

函数有两种:

  1. 第一种:用def函数定义的普遍函数
  2. 第二种:用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 存在的目的在于调试,便于开发者使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值