首页 AI Studio教育版 帖子详情
百度飞桨领航团零基础Python速成营个人总结
收藏
快速回复
AI Studio教育版 文章使用问题 593 3
百度飞桨领航团零基础Python速成营个人总结
收藏
快速回复
AI Studio教育版 文章使用问题 593 3

字符串:

切片的语法:[起始:结束:步长] 字符串[start: end: step] 这三个参数都有默认值,默认截取方向是从左往右的 start:默认值为0; end : 默认值未字符串结尾元素; step : 默认值为1;

格式化输出:

  • %,(类似C):
    print('大家好!我叫%s,我的身高是%d cm, 数学成绩%.2f分,英语成绩%d分' % (name, hight, score_math, score_english))
  • format:
    print('大家好!我叫{},我的身高是{:d} cm, 数学成绩{:.2f}分,英语成绩{}分'.format(name, int(hight), score_math, score_english))​
  • f-string(Python 3.6):
    print(f"大家好!我叫{name},我的身高是{hight:.3f} cm, 数学成绩{score_math}分,英语成绩{score_english}分")​

生成器:

类似列表生成式: L = [x * x for x in range(10)]

基于函数: 将函数返回值关键字return 改为 yield

assert: 常用于检查传入函数的参数

def worker(s):
    assert type(s)== int
    assert s != 0​

 

logging:

import logging
logger = logging.getLogger()
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

# Configure stream handler for the cells
chandler = logging.StreamHandler()
chandler.setLevel(logging.INFO)
chandler.setFormatter(formatter)
logger.addHandler(chandler)
logger.setLevel(logging.INFO)

函数参数:
参数定义的顺序必须是:必选参数(name)、默认参数(age=18)、可变参数(*books:set())、命名关键字参数(city)和关键字参数(**kw:dict())

def student_info(name, age=18, *books, city, **kw):
# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
def person(name, age, *, city, job):
# 命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数(city, job)

变量作用域:

def change_my_name():
    print('我的名字曾经是', name) #UnboundLocalError: local variable 'name' referenced before assignment
    name = '李四'
    print('我的名字现在是', name)

name = '张三'
change_my_name()
name

定义的函数中有与全局变量同名的变量被赋值,则会定义为局部变量

global 关键字调用全局变量 在函数内部的修改也会改变其在函数外部的值

def change_my_name():
    global name
    print('我的名字曾经是', name)
    name = '李四'
    print('我的名字现在是', name)

lambda匿名函数:
lambda 若干个输入参数 : 返回值的表达式

lambda arg1, arg2: arg1 + arg2


lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

高阶函数:
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

reduce(): 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,依此类推,最后得到一个结果。

key 可以是一个lambda或函数 对每个位置上的元素进行特定操作(或指定比较的对象)后比较

sorted(iterable, key=None, reverse=False)
key = lambda x:x.value
key = lambda x: x[0]
sorted([36, 5, -12, 9, -21], key=abs) #按绝对值排序key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序

装饰器:

  • 闭包:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
# 一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了f()才执行。
def count():
    fs = []
    for i in range(1, 4):
        def f():
            # print(id(i))
            return i*i
        fs.append(f)
    return fs
f1, f2, f3 = count()

在这个闭包中,f()并没有被执行,但在调用count()函数时,其中的for循环已经结束,包含的变量i为3,所有三个函数返回的i*i结果一致
返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

def count():
    def f(j):
        def g():
            # print(id(j))
            return j*j
        return g

    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return

在这个函数中f()可以独立看作一个闭包,在这个闭包中的闭包g()返回的j*j就不属于循环变量,而是调用时传入的变量


装饰器是函数的函数,传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。

# 装饰器输入一个函数,输出一个函数
def print_working(func):
    def wrapper(*args, **kw):
        print(f'{func.__name__} is working...')
    func(*args, **kw)
    return wrapper
# 使用
# Method 1
worker1 = print_working(worker1)
worker1()
# Method 2 Better
@print_working
def worker1():
    print('我是一个勤劳的工作者!')

装饰器最大的优势是用于解决重复性的操作,其主要使用的场景有如下几个:

  • 计算函数运行时间
  • 给函数打日志
  • 类型检查

偏函数:
通过设定参数的默认值,降低函数调用的难度

from functools import partial

def student_info(name, age, city):
    print(f'我的名字叫{name}, 今年{age}岁,来自{city}')
student_info_beijing = partial(student_info, city='北京')
student_info_beijing('Molly',18)

 

原始函数没有默认值,后期重载一个包含默认值的

 

0
收藏
回复
全部评论(3)
时间顺序
AIStudio810258
#2 回复于2021-02

收获满满,加油,共同进步!

0
回复
来学习的人
#3 回复于2021-03

确实收获满满,值得鼓励

0
回复
Y_kira
#4 回复于2021-03

收获满满,加油

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户