Ywc

Python高级特性

Word count: 1.1k / Reading time: 4 min
2019/12/05 Share

廖雪峰:https://www.liaoxuefeng.com/wiki/1016959663602400/1017269809315232

python 一些特性

装饰器

装饰器(Decorator):在代码运行期间动态增加功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import functools

def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('call %s():' % func.__name__)
return func(*args, **kw)
return wrapper

@log
def now():
print('2015-3-25')

now()

def logger(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator

@logger('DEBUG')
def today():
print('2015-3-25')

today()
print(today.__name__)

输出的结果为:

1
2
3
4
5
call now():
2015-3-25
DEBUG today():
2015-3-25
today

进程、线程和多进程、多线程

进程(Process):相当于一个“任务”
线程(Thread):进程内的这些“子任务”称为线程
多进程(multiprocessing):Pool(进程池):如果要启动大量的子进程,可以用进程池的方式批量创建子进程:
多线程()::_threadthreading 两个模块可以使用,一般使用threading模块

切片

  • 利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
1
2
3
4
5
6
7
# -*- coding: utf-8 -*-
def trim(s):
if s[:1]==' ':
return(trim(s=s[1:]))
if s[-1:]==' ':
return(trim(s=s[:-1]))
return(s)

迭代

如果给定一个list或tuple,通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# coding=utf-8
import random
def findMinAndMax(L):
if L==[]:
return(None,None)
else:
min=L[0]
max=L[0]
for i in L:
if min>i:
min=i
if max<i:
max=i
return[min,max]

print(findMinAndMax([1,2,3,4]))

列表生成式

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

例子:生成[1x1, 2x2, 3x3, …, 10x10]

方法一:循环:

1
2
3
4
L=[]
for x in range(111):
L.append(x*x)
print(L)

方法二:列表生成式

1
2
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

练习:

1
2
3
# -*- coding: utf-8 -*-
L1 = ['Hello', 'World', 18, 'Apple', None]
L2 = [s.lower() for s in L1 if isinstance(s,str)] //isinstance函数可以判断一个变量是不是字符串

生成器

在Python中,这种一边循环一边计算的机制,称为生成器:generator

列表生成式的[]改成(),就创建了一个generator

next()函数获得generator的下一个返回值

一般通过for循环来迭代生成器

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

迭代器

可直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yieldgenerator function

这可以直接作用于for循环的对象统称为可迭代对象Iterable

可以使用isinstance()判断一个对象是否是Iterable对象。

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的

函数式编程

高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

map/reduce

Python内建了map()和reduce()函数

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

reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

  • reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

例:

1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字

1
2
3
4
5
6
7
# -*- coding: utf-8 -*-
def normalize(name):
name=name[0].upper()+name[1:].lower()
return name
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)

原文作者: Ywc

原文链接: https://yinwc.github.io/2019/12/05/learnpython/

发表日期: December 5th 2019, 4:29:37 pm

版权声明:

CATALOG
  1. 1. python 一些特性
    1. 1.1. 装饰器
  2. 2. 进程、线程和多进程、多线程
    1. 2.1. 切片
    2. 2.2. 迭代
    3. 2.3. 列表生成式
    4. 2.4. 生成器
    5. 2.5. 迭代器
  3. 3. 函数式编程
    1. 3.1. 高阶函数