Python 基础知识相关笔记(一)

运算符
python运算符可以连用 操作数之间可以互相比较大小
>>> 1<3<5
True

关键字

关键字作用
global定义或声明全局变量
lambda定义lambda表达式,类似于函数 [匿名函数]
nonlocal声明nonlocal变流量
pass空语句
raise显示抛出异常
yield在生成器函数中用来返回值
assert断言,用来确认某个条件必须满足,可以用来调试程序
def定义函数
except用在异常处理结构中,捕获特定的异常
finally用在异常处理结构中,不论是否发生异常都会执行的代码

切片
[start : end : step]
start:表示切片开始的位置,为0时可以省略
end:表示切片截止的位置,不包含当前位置,表示列表长度时可以省略
step:表示切片每一步的步长,若为负数,表示反向切片

  1. 切片可以为列表增加元素:
    alist[ len(alist) : ] = [1,2] #在alist列表尾部增加两个元素
  2. 使用切片替换和修改列表中的元素
    alist[ : 3] = [1, 2, 3] #将列表中的前三个元素用[1,2,3]来代替
  3. 用切片来删除元素
    alist [ : 3] = [ ] # 删除列表前三个元素

利用切片技术实现一个trim()函数,去除字符串首尾的空格

def trim(s)
    while s[:1] == ' ':
        s = s[1:]
    while s[-1:] == ' ':
        s = s[:-1]
    return s

迭代
enumerate() 函数用来枚举可迭代对象中的元素
使用迭代查找list中的最大值和最小值

def findMinAndMax(L):
    if L == []:
        return (None, None)
    max = L[0]
    min = L[0]
    for i in L:
        if(max <= i):
            max = i
        if(min >= i):
            min = i
    return (min,max)

内置函数map() 把一个函数一次映射到序列或者迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果
range()函数用于返回具有惰性求值特点的range对象 左闭右开区间 [start,end)
range(1,10,2) # 从1到9 每隔2取一次数 [1,3,5,7,9]
range(9,0,-2) [9,7,5,3,1]
zip()函数 用来把多个迭代对象中的元素压缩到一起
x = zip(‘abc’ , ‘123’) [(‘a’,‘1’),(‘b’,‘2’),(‘c’,‘3’)]


列表生成式
list中若全部是字符串的话可以通过s.lower()将大写字母转化成小写字母
若list中既包括字符串又包括非字符串类型,请将list中的大写 全部转化成小写

L1 = ['Hello', 'World', 18, 'Apple', None]
L2 =  [s.lower() for s in L1 if isinstance(s,str) is True]

生成器 generator
将list列表生成式中的 [ ] 改成 ( ) ,需要用到next() 来调用显示其值
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误
用for循环遍历,不用考虑StopIteration的错误
generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
尝试用generator输出杨辉三角,不断输出下一行list

def triangles():
    L = [1]
    while 1:
        yield L
        L = [1] + [L[i] + L[i+1] for i in range(len(L)-1)] + [1]
n = 0
results = []
for t in triangles():
    print(t)
    results.append(t)
    n = n + 1
    if n == 10:
        break
结果:
[1] 
[1, 1] 
[1, 2, 1] 
[1, 3, 3, 1] 
[1, 4, 6, 4, 1] 
[1, 5, 10, 10, 5, 1] 
[1, 6, 15, 20, 15, 6, 1] 
[1, 7, 21, 35, 35, 21, 7, 1] 
[1, 8, 28, 56, 70, 56, 28, 8, 1] 
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1] 

生成器 Iterattor
生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数
Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流
filter
Python内建的filter()函数用于过滤序列。
和map()类似,filter()也接收一个函数和一个序列。
和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list

判断1000以内的回数

def is_palindrome(n):
    return str(n) == str(n)[::-1]  #字符串反转判断是否相等
output = filter(is_palindrome, range(1, 1000))
print('1~1000:', list(output))

sort()高阶函数排序

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):    #按照姓名字母顺序排序
    return t[0]
def by_score(t):    #按照成绩排序
    return -t[1]
 L2 = sorted(L, key=by_name)   
 L2 = sorted(L, key=by_score)

闭包
**!!**返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
利用闭包返回一个计数器函数,每次调用它返回递增整数:

def createCounter():
    n = 0
    def counter():
        nonlocal n
        n = n+1
        return n
    return counter
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5

其中nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
这里n为外层变量,在counter()中需要引用这个n 非全局的变量
Python里只有2种作用域:全局作用域和局部作用域。
全局作用域是指当前代码所在模块的作用域
局部作用域是指当前函数或方法所在的作用域
其实准确来说,Python 3.x引入了nonlocal关键字,可以用于标识外部作用域的变量。
局部作用域里的代码可以读外部作用域(包括全局作用域)里的变量,但不能更改它。一旦进行更改,就会将其当成是局部变量。
匿名函数 lambda
lambda x : x * x ⇒ def f(x): return x * x
匿名函数只能有一个表达式,不用写return,返回值就是该表达式的结果
匿名函数没有函数名,不用担心函数名冲突
可以把匿名函数赋值给一个变量,用变量来调用该函数 f = lambda x: x * x
也可以把匿名函数作为返回值返回
def build(x, y):
return lambda: x * x + y * y

装饰器 Decorator
在代码运行期间,不修改相关函数代码,动态增加功能的方式叫做装饰器

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper
@log
def now():
   	print('2019-01-01')
------      结果   	--------
call now():
2019-01-01

wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。 # *args 表示关键字参数 **kw 表示可变参数

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

#有参数
def log(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

import functools是导入functools模块
Python内置的functools.wraps 的作用为 wrapper.name = func.name

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值