python-高级特性

# 高级特性
# 1.切片
L = ["1","2","3","4"]
print("L的元素:",L) # ==> 输出 L的元素: ['1', '2', '3', '4']
# 1.1 取出前三个元素
print("L[1]=%s,L[2]=%s,L[3]=%s"%(L[1],L[2],L[3])) # ==> 输出 L[1]=2,L[2]=3,L[3]=4
# 1.2 切片取出: 从索引0开始取,直到索引3为止,但不包括索引3
print("切片取出L[0:3]=",L[0:3]) # ==> 切片取出L[0:3]= ['1', '2', '3']
# 1.3 取出倒数第一个元素
print("L[-1]=%s"%L[-1]) # ==> L[-1]=4
# 1.4 切片取出倒数第一个第二个元素: 倒取元素顺序:-1、-2、-3......
print("倒数第二个元素%s"%L[-2:-1]) # ==> 输出 倒数第二个元素['3'] 从-2开始算起(包含-2)但不包括-1
print("L[-2]:%s"%L[-2])
# 备注: 切片的倒数第一个元素的是从-1开始取的所以要取出倒数第一个元素直接L[-1]
print(L[0:-1])
# ******* 字符串切片 ******** 每隔两个取出对应元素
L1 = "abcdefghijklmnopqrstuvwxyz"
print("L1隔两个元素输出所有:",L1[::2])
print("简写取出前三个元素:",L1[:3])
print("取出所有:",L1[:])

# 2.迭代:for循环遍历称之为迭代
dic = {"a","b","c","d"}
for x in dic :
    print("x=%s"%x) # ==> 输出 x=b x=a x=c x=d dic是无序的 所以输出也可能也是无序的

# 2.1 那么,如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
print("*****迭代***********")
from collections import Iterable
print(isinstance('abc', Iterable)) # str是否可迭代 ==> 输出 True
print(isinstance([1,2,3], Iterable)) # list是否可迭代 ==> 输出 True
print(isinstance(123, Iterable)) # 整数是否可迭代 ==> 输出 False

# 2.2 可迭代对象,不管是否有下标,都可以迭代
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
    print("dic迭代key",key) # ==> dic迭代key b   dic迭代key a   dic迭代key c
for value in d.values():
    print("dic迭代value",value) # ==> dic迭代value 2   dic迭代value 1  dic迭代value 3
for k,v in d.items():
    print("key=%s,value=%s"%(k,v)) # ==> key=b,value=2  key=a,value=1  key=c,value=3
# 2.3 有下标的迭代
for i,value in enumerate(["a","b","c"]):
    print(i,value) # ==> 0 a   1 b   2 c
for x,y in [(1,1),(2,2),(4,3)]:
    print(x,y) # ==> 1 1   2 2    4 3
# 3.列表生成式
# 3.1 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
list(range(1, 11)) # ==> 输出[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 3.2 循环生成list
L2 = [x*x for x in range(1, 11)] # ==> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 3.3 循环生成list并加以判断
[x * x for x in range(1, 11) if x % 2 == 0] # ==> [4, 16, 36, 64, 100]
# 3.4 还可以使用两层循环,可以生成全排列:
[m + n for m in 'ABC' for n in 'XYZ'] # ==> ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
# 练习 一个list既包含字符串又包含数字 把字符串小写输出
L = ["Hello","World",24,"fengwei"]
L1 = []
for i in L:
    if (isinstance(i,str)):
        L1.append(i.lower())
    else:
        L1.append(i)
print("结果:",L1) # ==> 结果: ['hello', 'world', 24, 'fengwei']
# 解法二
L3 = [string.lower() for string in L if isinstance(string,str) == True]
print("L3:",L3) # ==> L3: ['hello', 'world', 'fengwei']
L4 = [string.lower() if isinstance(string,str) else string for string in L]
print("L4:",L4) # ==> L4: ['hello', 'world', 24, 'fengwei']
L5 = [string.upper() if isinstance(string,str) else string for string in L]
print("L5:",L5) # ==> L5: ['HELLO', 'WORLD', 24, 'FENGWEI']
L6 = [s[:1].upper()+s[1:].lower() if isinstance(s,str) else s for s in L]
print("L6:",L6) # ==> L6: ['Hello', 'World', 24, 'Fengwei']

# 4.生成器: 在循环的过程中不断推算出后续的元素,不必创建完整的list,从而节省大量的空间
# 4.1创建方法一:把列表生成的[]改成()就可以创建一个generator(生成器)
gener = (x*x for x in range(10))
print("生成器:",gener) # ==> 生成器: <generator object <genexpr> at 0x10ac0be60>
for g in gener:
    print("next输出:",g) # ==> next输出: 0  next输出: 1  next输出: 4 .......
# 备注: 当生成一个生成器我们取出内容时直接用for循环取出 next(gener) 只能一个一个的取出基本无用 并且不需要关心StopIteration的错误

# 斐波拉契数列: 除第一个和第二个数外,任意一个数都可由前两个数相加得

def feiBoList(a):
    output = []
    if isinstance(a,str) :
        print("类型错误")
        output.append(1)
    else:
        p = list(range(a))
        p.pop(0)
        p.insert(1,1)
        for i,x in enumerate(p):
            if i == 0 or i == 1:
                output.append(x)
            else:
                m = output[i-2]
                n = output[i-1]
                output.append(m+n)
                if (m+n) > a:
                    break
    return output

print("斐波拉契:",feiBoList(100)) # == > 斐波拉契: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]

# 方法2
# Fibonacci series: 斐波纳契数列
# 两个元素的总和确定了下一个数
a, b = 0, 1
while b < 10:
    print(b)
    a, b = b, a+b
# 5. 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
# 备注: 理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

# 练习 输出杨辉三角
def yangHuiFunc():
    L = [1]
    while True:
        yield L
        L = [1] + [ L[x-1] + L[x] for x in range(1,len(L)) ] + [1]
# 解释: 调用test函数
#       n = 0 ,yield L  直接打印L[1] ==> [1]
#       n = 1 L[1] range(1,1)不会执行       : L = [1] + [L[0] + L[1] for x in range(1,1)] + [1] == > [1,1]
#       n = 2 L[1,1] range(1,2) = [1]     : L = [1] + [L[0] + L[1] for x in range(1,2)] + [1] == > [1,2,1]
#       n = 3 L[1,2,1] range(1,3) = [1,2] : L1 = [L[0] + L[1] for x in range(1,3)] == > [3]
#                                           L2 = [L[1] + L[2] for x in range(1,3)] == > [3]
#                                           L  = [1] + L1 + L2 + [1] == > [1,3,3,1]
#       n = 4 L[1,3,3,1] range(1,4) = [1,2,3] : L1 = [L[0] + L[1] for x in range(1,3)] == > [4]
#                                               L2 = [L[1] + L[2] for x in range(1,3)] == > [6]
#                                               L3 = [L[2] + L[3] for x in range(1,4)] == > [4]
#                                               L = [1] + L1 + L2 + L3 + [1] == > [1,4,6,4,1]
#       n = ......

n = 0
for x,t  in enumerate(yangHuiFunc()):
    #    print("第%d个"%x)
    print(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]

 

发表于 2017-07-10 10:41  土土木  阅读(291)  评论(0编辑  收藏  举报