本文档是我在学习python时,一些自己觉得比较重要的地方的一些记录,可能存在理解(过程一类的)错误的地方,甚至本来整个表象(结论)都是错误的,我将尽量避免,发现错误后,欢迎留言提出,谢谢。学习python我是阅读以下文档,也推荐去阅读学习哦~
廖雪峰的python3教程

   目录

dict
递归函数
切片
生成器
迭代器
map/reduce
filter


dict 返回目录

dict对象的函数:(d是一个指向dict的变量)
d.keys() 取所有的值,返回:dict_keys([key1,key2]),迭代时可以直接写for key in d
d.vaules() 取所有的值,返回:dict_values([values1,values2])
d.items() 取所有的对象,返回:dict_items([(key1,value1),(key2,value2)])
以上取出的顺序不固定,不一定与dict定义时元素的顺序相同。

递归函数 返回目录

为了防止递归调用的栈溢出,需要使用尾递归的方法,return 中调用自身是不能存在表达式的,只能存在调用自身的这个函数调用。

def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num - 1, num * product)

如上,调用return fact_iter(n,1),会直接返回fact_iter(n,1)函数,然后结束fact(n)函数的调用。之后fact_iter(num,product),将会在return fact_iter(num-1,numproduct)时,首先计算num-1,numproduct,然后返回并调用fact_iter这个自身函数,结束上一个fact(n,1)的调用,不会像平常return 带有表达式的递归一样,需要等待所有递归调用的函数返回结果后才继续运算最初的return,避免了栈的积累。


切片 返回目录

切片的格式 开始位置:结束位置:相隔距离
切片可以切片字符串(python3,unicode字符串),切片一个汉字也算一个位置,例如

str = "哈咯啊"
print(str[0:1])

取出来的是第一个字符哈。


生成器 返回目录

g = (x for x in range(1,5))

让函数变成生成器,只要有yield函数即可。


迭代器 返回目录

可迭代不等于迭代器。可被next调用的才事迭代器。

from collections import Iterator
if isinstance(a,Iterator)

使用以上语句可以判断一个变量指向的对象是否是一个迭代器。
list tuple 等可以使用iter()转换为迭代器。


map/reduce 返回目录

map返回的结果是一个惰性序列的迭代器(Iterator)。

reduce传入的iterable(list/tuple/dict等等),需要至少有两个元素,才能执行其中的函数。如传入的是'a',那么这个iterable对象就只有一个元素,将不会执行其中传递给reduce的函数。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from functools import reduce
def normalred(a,b):
    if len(a)==1:
        a = a.upper();
    return a+b.lower();

def normalize(name):
    #if len(name)<2:
        #raise  TypeError("It isn't a name!");
    return reduce(normalred,name);

L1=['adam','LISA','b']
L2=list(map(normalize,L1))
print(L2)

如上例子,'b'将不会有任何的变化,会被直接返回'b'。


filter 返回目录

filter 返回的结果是一个惰性序列的迭代器(Iterator)。
函数返回结果为true则保留,否则过滤。

过滤非回文数字

# -*- coding:utf-8 -*-

def is_palindrome(n):
    numstr = '%d' % n
    numlen = len(numstr)
    numhead = 0
    numfoot = numlen - 1
    while numfoot>numhead:
        if not numstr[numhead]==numstr[numfoot]:
            return False
        numhead=numhead+1
        numfoot=numfoot-1
    return True
output = filter(is_palindrome,range(1,1000))
print(list(output))