1.List基础

1.1定义

classmates = ['Michael', 'Bob', 'Tracy']
print('Max:'+max(classmates))

1.2整体和单个输出

print(classmates)
print(classmates[0])

1.3判断某个元素是否存在

print("Bob" in classmates)

1.4获取最后一个元素

print("最后一个元素为"+ classmates[-1])

1.5获取倒数第二个元素

print("倒数第二个元素为"+ classmates[-2])

1.6赋值

可以赋不同类型的值

classmates[0]="0"
classmates[1]=1
classmates[2]="2"

1.7取长度

print("集合长度为: %d " % len(classmates))

1.8循环遍历

for i in range(0, 2 + 1):
    print(classmates[i])

for temp in classmates:
    print(temp)

1.9末尾添加和指定位置添加

classmates.append("3")
classmates.insert(0,12)
print(classmates)

1.10移除指定元素

classmates.remove('0')
print(classmates)

1.11移除末尾和移除指定位置的元素

classmates.pop()
classmates.pop(0)
print(classmates)

1.12多维集合

p=['asp', 'php']
s = ['python', 'java',p , 'scheme' ]
print(s)
print(s[2][1])

2.tuple

2.1tuple和list非常类似,但是tuple一旦初始化就不能修改

mates = ('Michael', 'Bob', 'Tracy')
print(mates)

2.2

获取元素和遍历的方法与List相同,但是不能 添加 修改 删除 其中的元素

mates[0])=0   #E0001:invalid syntax  tuple
print(mates[0])

2.3 只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

t = (1,)
print(t)

2.4“可变的”tuple:

t = (1,[2],3)
t[1].append(3)
t[1].insert(0,20) 
print(t)

tuple不变,指的是,tuple的每个元素,指向永远不变,当元素存储的是基本数据类型时,就直接指向该数值,而第二个元素 指向的是 List的首地址,tuple始终指向该List未发生改变

2.5遍历

for temp in t:
    print(temp)

3.切片

3.1 List切片

有序集合List取指定索引范围的操作,Python提供了切片(Slice)操作符

L =[1,2,3,4,5,6,7,8,9,9,55,5,22]
print(L[0:3])
# 从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。
L1=L[2:6]
print(L1)
print(L[6:])# 第二个索引缺失表示到最后
print(L[:3])# 第一个索引缺失表示到最前
print(L[-2:])# -2 表示倒数第二个

L=list(range(100))

# 前十个
print(L[:10])
# 后十个
print(L[-10:])
# 11-20
print(L[10:20])
# 前十个,每两个取一个
print(L[:10:2])
# 所有数,每5个取一个:
print(L[::5])

3.2 tuple切片

tuple也是一种list,唯一区别是tuple不可变。 因此,tuple也可以用切片操作,只是操作的结果仍是tuple:

T=(1,2,3,4,5,6,7,8,9)
print(T)
print(T[:3])

3.3 字符串切片

字符串’xxx’也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

S="0123456789"
print(S[:3])

4. 迭代

L=[1,2,3,4,5,6,7,8,9]
T =(1,2,3,4,5,6,7,8,9)
S=set(L)
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
d['TOM']=100 
d['Bob']=200 
s='123456789'

# 迭代,统一采用相同的个数

# list
print('-------------')
for temp in L:
    print(temp)

# tuple
print('-------------')
for temp in T:
    print(temp)


# dict
print('-------------')
for temp in d:
    print(temp)

print('-------------')
for temp in d.keys():
    print(temp)

print('-------------')
for temp in d.values():
    print(temp)

print('-------------')
for tempK,tempV in d.items():
    print(tempK)
    print(tempV)

# set
print('-------------')
for temp in S:
    print(temp)

# str
print('-------------')
for temp in s:
    print(temp)

所以,当我们使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行,而我们不太关心该对象究竟是list还是其他数据类型。那么,如何判断一个对象是可迭代对象呢?
方法是通过collections模块的Iterable类型判断:

1.引包,2.判断

from collections import Iterable
f=isinstance('abc', Iterable) # str是否可迭代
print(f)

最后一个小问题,如果要对list实现类似Java那样的下标循环怎么办?
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

for x, y in [(1, 1), (2, 4), (3, 9)]:
    print(x, y)

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用

print(list(range(1, 11)))

但如果要生成[1x1, 2x2, 3x3, …, 10x10]怎么做

方法一、循环生成

L=[]
for i in range(1,11):
    L.append(i*i)
print(L)

方法二、用列表生成式

L2=[i*i for i in range(1,11)]
print(L2)

同样可以在for后面加上if

L3=[i*i for i in range(1,11)if i%2==0]
print(L3)

变着花样的来

L4=[i+j for i in 'abc' for j in 'xyz']
L5=[i+j for i in 'abc' if i>'b'  for j in 'xyz' if j>'y']
print(L4)
print(L5)

运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

import os  # 导入os模块,模块的概念后面讲到
L6=[d for d in os.listdir('.')] # os.listdir可以列出文件和目录
print(L6)

把一个list中所有的字符串变成小写:

L7= ['Hello', 'World', 'IBM', 'Apple']
L8=[s1.lower() for s1 in L7]
print(L8)

练习

如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:
使用内建的isinstance函数可以判断一个变量是不是字符串

L9 = ['Hello', 'World', 18, 'Apple', None]
请修改列表生成式,通过添加if语句保证列表生成式能正确地执行:
期待输出: [‘hello’, ‘world’, ‘apple’]

L10=[s1.lower() for s1 in L9 if isinstance(s1 ,str)]
print(L10)

5. 生成器

在循环的过程中不断推算出后续的元素呢?
在Python中,这种一边循环一边计算的机制,称为生成器:generator。

5.1例子介绍

L = [x * x for x in range(10)]
print(L)
g = (x * x for x in range(10))

L是一个list,而g是一个generator。注意与 tuple区分

print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))

for n in g:
    print(n)

因为g是一个generator,因此,会在之前生成的基础上进行生成,不会每次从最初值开始

5.2另一种方式创建 generator

定义一个斐波那契数列函数

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'

a, b = b, a + b 相当于:
t = (b, a + b) # t是一个tuple
a = t[0]
b = t[1]

5.3定义一个斐波那契数列生成器

def fib1(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'


f= fib1(5)
for i in f:
    print(i)