大家好,为大家带来python中核心知识的讲解,不讲最基础的语法,这个大家都能轻松学会,不耽误时间,只有干货。

###查看当前作用域内的所有变量

>>>help('__main__')

退出键

注:help函数用来查看帮助或运行时信息

###自动化内存管理和引用计数

每个对象会记录有几个变量引用自身,当引用的数量为0时此对象被销毁,此种自动化内存管理的方式叫引用计数.

###is/is not 运算符

is的作用:判断两个对象是否是同一个对象(比较内存中的地址),当是同一个对象返回True,否则返回False, is not 的作用与 is相反

###小整数对象池

CPython 中 整数 -5 至 256永远存在于小整数对象池中,不会释放并可重复使用

###id(x) 函数

作用:返回一个对象在内存中的地址

###bool(x)返回假值的情况

bool(x)用于显示获取x的布尔值

假值情况

None 空值

False 布尔假值

0 0.0 0j 所有数字零

'' 空字符串

[] 空列表

() 空元组

{} 空字典

set() 空集合

.... 一切空的容器对象bool(x)取值为假

推导式

列表推导式

列表推导式是用可迭代对象创建列表的表达式

作用:用简易方法生成列表

语法:

[表达式 for 变量 in 可迭代对象]

[表达式 for 变量 in 可迭代对象 if 真值表达式]

示例:

# 生成一个数值为1~9的平方的列表

# [1, 4, 9, 16, .... 81]

# 不用推导式:

L = []

for i in range(1, 10):

L.append(i**2)

# 推导式实现

L = [i ** 2 for i in range(1, 10)]

# 用列表推导式生成 1~100以内奇数的列表, 结果是:[1, 3, 5, 7, ...., 99]

# 答案:

[i for i in range(1, 100, 2)]

# 或

[i for i in range(1, 100) if i % 2 == 1]

####列表推导式的嵌套

语法

[表达式

for 变量1 in 可迭代对象1 if真值表达式1

for 变量2 in 可迭代对象2 if 真值表达式2 ...]

示例:

L = [x + y

for x in [10, 20, 30]

for y in [1,2,3]]

print(L) #[11, 12, 13, 21, 22, 23, 31,32,33]

练习:

1. 用字符串"ABC"和字符串"123" 生成如下列表

['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3', ]

2. 已知有一个字符串:

s = '100,200,300,500,800'

将其转化为列表,列表的内部是整数

L = [100, 200, 300, 500, 800]

答案:

1. [ x + y for x in "ABC" for y in "123"]

2. L = [int(x) for x in s.split(',')]

####字典推导式

是用可迭代对象生成字典的表达式

语法:

{键表达式 : 值表达式 for 变量 in 可迭代对象[if 真值表达式]}

注: []表示其中的内容可省略

示例:

# 生成一个字典,键为数字 1 ~ 9,值为键的平方

d = {x : x ** 2 for x in range(1, 10)}

高阶函数

map 函数

map(func, *iterable)

作用:返回一个可迭代对象,此可迭代对象用函数func对可迭代对象iterable中的每一个元素作为参数计算后得新的数据

示例:

# 此示例示意map函数的使用

def power2(x):

return x**2

for x in map(power2, range(1, 10)):

print(x) # 1, 4, 9, 16 ... 81

练习:

求 1**2 + 2**2 +3**2 +...+ 9**2 的和

求 1**3 + 2**3 +3**3 +...+ 9**3 的和

答案:

s = sum((map(lambda x : x**2, range(1, 10))))

print(s)

s = sum((map(lambda x : x**3, range(1, 10))))

print(s)

####filter 函数

语法: filter(function, iterbale)

作用:

筛选可迭代对象iterable 中的数据,返回一个可迭代对象,此可迭代对象只返回iterable中符合条件的数据

function将对iterbale中提供的每个数据进行求布尔值,如果为True则保留,否则为False 丢弃数据

示例:

# 将1-20的偶数用filter生成可迭代对象后,将可迭代对象生成的数据存于列表中

l = list(filter(lambda x : x%2==0, range(1,21)))

print(l)

sorted 函数

作用:

将原可迭代对象的数据进行排序,生成排序后的列表

函数参数格式

sorted(iterable, key=None, reverse=False)

说明

iterable 可迭代对象

【key函数】是用来提供一个值,这个值将作为排序的依据,如果不给出key函数,则用

原数据的值进行比较和排序

reverse 标志用来设置是否降序排序

示例

l = [5, -2, -4, 0, 3, 1]

l2 = sorted(l) # [-4, -2, 0, 1, 3, 5]

l3 = sorted(l, reverse=True) # [5, 3, 1, 0, -2, -4]

l4 = sorted(l, key=abs) # [0, 1, -2, 3, -4, 5]

names = ['Tom', 'Jerry', 'Spike', 'Tyke']

l5 = sorted(names) # ['Jerry', 'Spike', 'Tom', 'Tyke']

names = ['Tom', 'Jerry', 'Spike', 'Tyke']

l5 = sorted(names, key=len) # ['Tom', 'Tyke', 'Jerry', 'Spike']

练习

names = ['Tom', 'Jerry', 'Spike', 'Tyke']

排序的依据为字符串的反序

'moT' 'yrreJ' 'ekipS' 'ekyT'

结果为

['Spike', 'Tyke', 'Tom', 'Jerry']

答案

names = ['Tom', 'Jerry', 'Spike', 'Tyke']

l5 = sorted(names, key=lambda s : s[::-1])

装饰器

装饰器是一个函数,主要作用是用来包装另一个函数或类

包装的目的是在不改变原函数(或类名)的情况下改变被包装对象的行为

函数装饰器

是指装饰器是一个函数,传入的是一个函数,返回的是一个函数

语法

def 装饰器函数名(参数):

语句块

return 函数对象

@装饰器函数名

def 函数名(形参列表):

语句块

原理

被装饰器函数的变量(函数名)绑定装饰器函数调用后的返回的函数

示例1

# 此示例示意装饰器函数的定义和调用装饰器原理

def mydeco(fn): # <<

def fx():

print('fx被调用')

return fx

@mydeco

def myfun():

print('myfun被调用')

# 上述 mydeco的原理是在 def myfun语句调用之后加了一条如下语句

# myfun = mydeco(myfun)

myfun() #调用myfun

myfun()

myfun()

示例2

# 此示例示意装饰器函数用来包装被装束函数

def mydeco(fn): # <<

def fx():

print('------这个被装饰函数调用之前-------')

fn() # 被调用被装饰函数

print('++++++这个被装饰函数调用之后+++++++')

return fx

@mydeco

def myfun():

print('myfun被调用')

# 上述 mydeco的原理是在 def myfun语句调用之后加了一条如下语句

# myfun = mydeco(myfun)

myfun() #调用myfun

myfun()

myfun()

示例3

# 此示例示意装饰器的应用场合及功能

# ---------------------以下是杨小哥写的程序--------------------------

def privileged_check(fn):

def fx(name, x):

print('正在进行权限验证。。。')

if True:

fn(name, x)

else:

print('权限验证失败')

return fx

def message_send(fn):

def fy(n, money):

fn(n, money) # 调用被装饰函数

print('正在发送短信给', n, '...')

return fy

# ---------------------以下是XB写的程序--------------------------

@ message_send

@ privileged_check

def savemoney(name, x):

print(name, '存钱', x, '元')

# 实质是

# savemoney = privileged_check(savemoney)

# savemoney = message_send(savemoney)

def withdraw(name, x):

print(name, '取钱', x, '元')

# ---------------------以下是调用者写的程序--------------------------

savemoney('小王', 200)

savemoney('小赵', 400)

withdraw('小李', 500)

函数的文档字符串

函数内第一次未赋值给任何变量的字符串是此函数的文档字符串

语法

def 函数名(参数列表):

'''函数文档字符串'''

语句块

说明

文档字符串通常用来说明函数功能和使用方法

在交互模式下,输入:

help(函数名) 可以查看函数的文档字符串

函数的文档字符串绑定在函数的__doc__属性上

示例

def mysum(n):

'''1 + 2 + 3 + 4 + ...+ n'''

return 100

help(mysum)

函数的__doc__属性

__doc__属性用于记录文档字符串

函数的__name__属性

__name__属性用于记录函数名

迭代器和生成器

迭代器 Iterator

迭代器是访问可迭代对象的工具

迭代器是指用iter(obj)函数返回的对象(实例)

迭代器可以用next(it)函数获取可迭代对象的数据

迭代器函数iter 和 next

iter(iterable)

从可迭代对象中返回一个迭代器,iterable 必须是能提供一个迭代器的对象

next(iterator)

从迭代器iterable中获取下一个记录,如果无法获取下一条记录,则触发StopIteration 异常

说明

1. 迭代器只能往前取值,不会后退

2. 用iter 函数可以返回一个可迭代对象的迭代器

示例

l = [1, 3, 5, 7]

it = iter(l) # 让l提供一个能访问自己的迭代器

print(next(it)) # 1 从迭代器中取值,让迭代器去获取l中的一个元素

print(next(it)) # 3 从迭代器中取值,让迭代器去获取l中的一个元素

print(next(it)) # 5 从迭代器中取值,让迭代器去获取l中的一个元素

print(next(it)) # 7 从迭代器中取值,让迭代器去获取l中的一个元素

# next(it) # StopIteration 异常

迭代器的用途

用迭代器可以依次访问可迭代对象的数据

l = [2, 3, 5, 7]

for i in l:

print(l)

# 以下用迭代器来访问

l = [2, 3, 5, 7]

it = iter(l)

while True:

try:

x = next(it)

print(x)

except StopIteration:

break

练习

有一个集合,

s = {'唐僧', '悟空', '八戒', '沙僧'}

用for语句来遍历所有元素如下

for x in s:

print(x)

else:

print('遍历结束')

将for语句改写为while语句和迭代器实现

生成器 Generator

生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)

生成器的两种方式

生成器函数

生成器表达式

生成器函数的定义

含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象

yield 翻译为(产生或生成)

yield 语句

语法

yield表达式

说明

yield 用于 def 函数中,目的是将此函数作为生成器函数使用

yield 用来生成数据, 供迭代器和next(it) 函数使用

示例

# 生成器函数只有在next(it) 函数调用时才会执行,且遇到yield后返回相应的值给next(it)函数

def my_yield():

print('即将生成2')

yield 2

print('即将生成3')

yield 3

print('即将生成5')

yield 5

print('即将生成7')

yield 7

print('生成器生成结束 ')

for i in my_yield():

print(i)

g = my_yield() # 调用生成器函数来创建一个生成器,此生成器能生成 2 3 5 7 四个数

it = iter(g) # 用生成器拿到对应的迭代器

print(next(it))

print(next(it))

# 用生成器函数来生成一些列的整数, 0 - n

def myinteger(n):

i = 0

while i < n:

yield i

i += 1

for x in myinteger(3):

print(x)

l = [x for x in myinteger(100) if x % 2 == 1]

print(l)

生成器函数的说明

生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象,通常用来动态生成数据

生成器函数调用return 语句会触发一个StopIteration 异常

练习

写一个生成器函数,myeven(start, stop)用来生成start开始带stop结束(不包含)的偶数

生成器表达式

语法

(表达式 for 变量 in 可迭代对象 [if 真值表达式])

作用

用推导式形式创建一个新的生成器

说明

if 子句可以省略

示例

gen = (x**2 for x in range(1, 5))

it = iter(gen)

print(next(it)) # 1

print(next(it)) # 4

print(next(it)) # 9

print(next(it)) # 16

print(next(it)) # StopIteration

练习

已知有列表

l = [2, 3, 5, 7]

1) 写一个生成器函数,让此函数能够动态提供数据,数据为原列表数字的平方加1

2) 写一个生成器表达式,让此表达式能够动态提供数据,数据为原列表数字的平方加1

3) 生成一个列表,此列表内的数据是原列表数据的平方加1

生成器表达式和列表推导式的区别

l = [2, 3, 5, 7]

l2 = [x ** 2 + 1 for x in l]

it = iter(l2)

print(next(it)) # ?

l[1] = 30

print(next(it)) # ??

# 以下是生成器表达式

l = [2, 3, 5, 7]

l2 = (x ** 2 + 1 for x in l)

it = iter(l2)

print(next(it)) # ?

l[1] = 30

print(next(it)) # ??

# 生成器表达式是现用现生成,列表推导式一次性生成静态数据

迭代工具函数

作用是生成一个个性化的可迭代对象

zip(iter1 [, iter2[...]])

返回一个zip对象,此对象用于生成元组,此元组的每个数据来源于参数中的可迭代对象,当最小的可迭代对象不再提供数据时迭代结束

enumerate(iterable [, start])

ZIP示例

numbers = [10086, 10000, 10010, 95588]

names = ['中国移动', '中国联通', '中国电信']

for t in zip(numbers, names):

print(t)

for No, number, name in zip(range(1, 100), numbers, names):

print('序号', No, name, '的客服电话是', number)

ENUMERATE 示例

names = ['中国移动', '中国联通', '中国电信']

for t in enumerate(names):

print(t)

for t in enumerate(names, 101):

print(t)

# 既能得到索引又能得到值

for index, name in enumerate(name):

print(index, name)

练习

写一个程序,读入任意行文字,当输入空行时结束,打印带有行号的输入的结果

如:

请输入:abdce

请输入:hello

请输入:bye

请输入:

输出如下:

第1行:abdce

第2行:hello

第3行:bye

迭代器(高级)

由iter(iterable) 函数返回,可以通过next(iterator) 函数取值的对象就是迭代器

迭代器协议

迭代器协议是指对象能够使用next()函数获取下一项数据,在没有下一项数据时触发一个StopIteration异常来终止迭代的约定

迭代器协议的实现方法

def __next__(self):

...

注: 此方法需要实现迭代器协议

# 此示例示意将自定义的类MyList创建的对象制作为可迭代对象

class MyList:

'''这是一个自定义的列表类型,此类型的对象用data属性绑定的列表来存储数据'''

def __init__(self, iterable=()):

self.__data = [x for x in iterable]

def __repr__(self):

return 'MyList(%s)' % self.__data

def __iter__(self):

'''此方法用来返回一个能访问self对象'''

'''此方法用来返回一个能访问self对象迭代器'''

# return iter(self.__data)

return MyListIterator(self.__data)

class MyListIterator:

'''此类用来描述能够访问MyList类型的对象的迭代器'''

def __init__(self, lst):

self.__data_lst = lst

self.__cur_index = 0 #迭代器的起始位置

def __next__(self):

'''此方法用来实现迭代器协议'''

if self.__cur_index >= len(self.__data_lst):

raise StopIteration

r = self.__data_lst[self.__cur_index]

self.__cur_index += 1

return r

myl = MyList([2, 3, 5, 7])

# ################

it = iter(myl) # 等同于it = myl.__iter__()

print(next(it)) # 2

# ################

for x in myl:

print(x)

深拷贝和浅拷贝

浅拷贝 shallow copy

浅拷贝是指在复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程

L = [3.1, 3.2]

L1 = [1, 2, L]

L2 = L1.copy() # 浅拷贝

print(L1) # [1, 2, [3.1, 3.2]]

print(L2) # [1, 2, [3.1, 3.2]]

L2[2][0] = 3.14

print(L1) # [1, 2, [3.14, 3.2]]

print(L2) # [1, 2, [3.14, 3.2]]

深拷贝 deep copy

复制对象及对象关联的对象一起复制过程叫深拷贝

import copy # 导入复制模块

L= [3.1, 3.2]

L1 = [1, 2, L]

L2 = copy.deepcopy(L1)  # 深拷贝

print(L1) # [1, 2, [3.1, 3.2]]

print(L2) # [1, 2, [3.1, 3.2]]

L2[2][0] = 3.14

print(L1) # [1, 2, [3.1, 3.2]]  <<< L1不变

print(L2) # [1, 2, [3.14, 3.2]]

字符串的文本解析方法

S.split(sep=None) 将字符串,使用 sep作用分隔符分割S字符串,返回分割后的字符串列表,当不给定参数时,用空白字符作为分隔符分割

S.join(iterable) 用可迭代对象中的字符串,返回一个中间用S进行分隔的字符串

s ='Beijing is capital'

L = s.split(' ') # L = ['hello', 'world', 'tarena']

s2 = "hello#world#tarena"

L = s2.split('#') # L = ['hello', 'world', 'tarena']

L = ['aaa', 'bbbb', 'ccccc']

'$'.join(L) # 生成 'aaa$bbbb$ccccc'

python3 中不可变数据类型

bool, int, float, complex, str, tuple, frozenset, bytes

python3 中可变数据类型

list, dict, set, bytearray

dir(obj) 函数

返回所有属性的字符串列表

with 语句深层次讲解

语法

with 表达式1 [as 变量1], 表达式2 [as, 变量2], ....

语句块

作用

使用于对资源进行访问的场合,确保使用过程中不管是否发生异常都会执行必须"清理"的操作,并释放资源

文件打开后自动关闭,线程中锁的自动获取和释放等

说明

as 字句中的变量用于绑定表达式执行后生成的对象

with 语句并不会改变异常的状态

环境管理器

1. 类内有__enter__ 和 __exit__ 实例方法的类创建的对象被称为环境管理器

2. 能够使用with语句进行管理的对象必须是环境管理器

3. __enter__ 方法将在进入with语句时被调用,由as变量绑定返回的对象

4. __exit__ 方法将在离开with语句时被自动调用,且可以通过参数来判断离开with语句时是否有异常发生

示例

class A:

'''此类对象可以用于with语句进行管理'''

def __enter__(self):

print('此方法是在with语句内执行的')

return self # self 将被with中的as 变量绑定

def __exit__(self, exc_type, exc_val, exc_tb):

''' exc_type 用来绑定错误类型,当没有异常发生时绑定None

exc_val 用来绑定错误对象,当内有发生异常时绑定None

exc_th 用来绑定TraceBack对象,当没有异常时绑定None

'''

if exc_type is None:

print('您已离开with语句, 离开时没有发生任何异常')

else:

print('您已离开with语句')

print('错误类型是:', exc_type)

print('错误的数据是:', exc_val)

print('Traceback:', exc_tb)

with A() as a:

print('这是with语句内部的输出')

int(input('输入:'))

print('程序正常退出')

以上就是用python爬取虾米播放记录的代码过程

我是白白,一个喜欢学习喜欢编程的年轻人

python装饰器深度讲解_python核心知识讲解,干货!!!相关推荐

  1. python装饰器代码简洁_Python基础知识之装饰器(示例代码)

    装饰器 https://www.cnblogs.com/EVA-J/articles/7194277.html 1. 装饰器的形成过程 2.装饰器的作用 3.语法糖 原则: 开放封闭原则 ------ ...

  2. python 装饰器有哪些_python装饰器有什么用

    简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能. 一般而言, ...

  3. python装饰器简单理解_python装饰器的简单理解

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 装饰器的使用方法很固定: 先定义一个装饰函数(帽子)(也可以用类.偏函数实现) 再定义你 ...

  4. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  5. python装饰器类型错误_Python各种类型装饰器?一起看看这份详解说明吧

    装饰器说明Python中的装饰器是一种可以装饰其它对象的工具. 该工具本质上是一个可调用的对象(callable),所以装饰器一般可以由函数.类来实现. 装饰器本身需要接受一个被装饰的对象作为参数,该 ...

  6. python装饰器与闭包_python闭包与装饰器

    本文针对: 学不会,学过即忘,学完跑路 的相关python人群. 一.Python闭包 定义: 访问了定义体以外的定义的非全局变量.(刚学时看不懂这句话太TM正常了) 定义解析: 其实就是函数里面再定 ...

  7. 大学python教材思维导图_Python核心知识体系的14张思维导图

    本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库). 按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典,集合),条件&循环,文 ...

  8. python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...

    1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...

  9. python装饰器的顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

最新文章

  1. Centos 7.2安装FTP服务并进行相关设置
  2. linux c语言 glibc 错误 munmap,Linux内存分配小结--malloc、brk、mmap
  3. PHP操作mongodb数据库操作类
  4. goldengate使用ASM存放trail文件注意事项
  5. 【转】做好性能测试的6个关注点
  6. php 同时导出两个文件_使用orangehill/iseed自动反向生成数据填充文件
  7. 事务对性能影响_不是事务的事务!(分布式事务系列-完结篇)
  8. opencore0.6.4_iOS 13.4/iPadOS 13.4正式版发布:iCloud支持文件夹共享
  9. Prototype使用Form.Element操作表单控件
  10. Linux常用命令之:软件安装命令
  11. MySQL报错: Access denied for user 'root'@'localhost'
  12. 开始研究3D并用硬件加速器实现
  13. m3 pcb开孔 螺丝_螺丝过孔工艺孔底孔尺寸参照表
  14. pta求阶乘序列前n项和_求极限方法总结
  15. FlinkKafkaProducer源码分析
  16. 数据库——实体联系模型
  17. 无线网服务器拒绝连接,网络拒绝连接什么原因
  18. 移动vue大转盘抽奖
  19. enable 华为交换机ntdp_华为交换机常用命令
  20. java采用Process.destroy无法停止子进程

热门文章

  1. ElementUI dialog弹框 退出时重置表单数据
  2. 【网络安全】红蓝攻防:shellcode的分析
  3. Windows内存管理学习笔记(一)—— 线性地址的管理
  4. 【MySQL】mysql 远程连接111
  5. 1.23 实例:五子棋游戏
  6. 4.1 基础-放苹果(整数划分)
  7. RabbitMQ三种订阅模式
  8. SolrJ添加删除文档
  9. 计算机缺少php5.dll,php5isapi.dll 64位
  10. sketch软件_Sketch软件怎么用?怎么提升Sketch软件技巧?