(2018-03-21)0003.Python基础入门班_第3课、容器以及容器的访问使用

上一篇文章:(2018-03-20)0002.Python基础入门班_第2课、关键字与循环控制

关于本人

个人信息:微博
写作区:个人博客、、开源中国、豆瓣、掘金、CSDN
代码管理区:码云、GitHub、GitBook、Python_NoteBook(这个仅仅限于自己的本地搭建)
我的网络制作书籍:Python3Book(基于廖雪峰的Python教程编写成书)、
july_Oneline(基于七月在线培训机构的教程编写成书)、

本课程更新:
LineCode刷题总结__GitBookEditor网络书籍


推荐网站

LintCode:一款程序员刷题网站(偏向于-->人工智能、算法)


推荐软件


推荐书籍


第3课 容器以及容器的访问使用


一、容器(list、tuple、dict、set)
百度维基

容器是用来存储和组织其他对象的对象。实现链表的类就是一个容器的示例。

自身理解

用来存储东西的器材。叫容器

代码展示

# 一、容器
# Code list
print('Code list')
li = [1,2,3,'456',[1,2,3],{1:'one',2:'two'}]
print(type(list))
print(type(li))

# 元素访问
print(li[0])
print(li[-1]) # li[len(li) - 1]
print(li[-2]) # li[len(li) - 2]
print('!end!\n')
# 查找元素位置
print(li.index('456'))
print(li.index([1,2,3]))
# print(li.index(-1)) # 如果不确定在list里面 一定要用try 捕获异常
print('!end!\n')

# 添加元素
l_a = [1,2,3]
l_a.append(4)
l_a.append(5)
l_b = [6,7,8]
# l_a.append(l_b)
l_a.extend(l_b) # 往list 添加一个list
print(l_a)
print('!end!\n')

# extend的实现原理
def my_extend(li,n_li):
    for i in n_li:
        li.append(i)

# 判断容器是否为空
l_a = []
if not l_a: # not xx 和 is None不是一回事
    print('Empty')
if len(l_a) == 0:
    print('Empty')
if l_a is None: #
    print('None')
print('!end!\n')

# 遍历数组的两种方式
for i in li:
    print(i)
for i in range(len(li)): # 这个是可以求数组的索引
    print(li[i])
print('!end!\n')

# tuple 和 list的区别
''' tuple只能读list,不支持元素赋值、没有append方法'''
t = (1,2,3,'456')
print(type(t))
# t[0] = 'a'
# t.append('x')
print('!end!\n')

# 有一个数组 找到数组里面的两个数,使得他们的和等于给定的数。如果有 返回数组这两个数的位置。没有返回-1
def two_sum(numbers,target): # 输入 和 输出
    # 保留数的位置
    # range(x) <=>[0,x-1] <=> range(0,x)
    for i in range(len(numbers) -1): # 取索引0的元素 依次和剩下的数进行相加
        for j in range(i+1,len(numbers)):
            if (numbers[i] + numbers[j] == target):
                return i,j
    return -1,-1 #找不到 就返回-1,-1
ret = two_sum([2,7,11,17],18)
print(type(ret))
print(two_sum([2,7,11,17],18))
print(two_sum([2,7,11,17],22))
print('!end!\n')

print(range(5))
# range(x) <=>[0,x-1] <=> range(0,x)
# for i in range(5):
for i in range(len([1,2,3,4,5,6])-1):
# for i in range(0,5):
    print(i)

# 删除
del (li[-1]) # del (list[index])
del (li[1])
del (li[-2])
print(li)
print('!end!\n')

# Code 字典
print('Code 字典 \n')
d = {'a':1,'b':2,1:'one',2:'two',3:[1,2,3]}
print(type(dict))
print(type(d))
print(d)
print('!end!\n')
# 访问元素
print(d['a'])
print(d[1])
print(d[3])
print('!end!\n')

# 判断元素是否存在(判断key是否存在) hax表
print('c' in d)
print(3 in d)
print('!end!\n')

# 删除元素
del(d[3]) #del(dict[key])
print(len(d))
print(d)
print('!end!\n')

# 添加元素
d[3] = [1,2,3,4]
d[3] = '1234'
# 遍历
# 根据key来遍历
for key in d:
    print(d[key])
print('!end!\n')
# 根据key,value来遍历
for key ,value in d.items():
    print(key,value)
print('!end!\n')
# 遍历所有的key
keys = d.keys()
print(type(keys))
print(keys)
print('!end!\n')

# Code Set (无序的)
print('Code Set \n')
s_a = set([1,2,3,4,5,6])
s_b = set([4,5,6,7,8,9])
print(s_a)
print(s_b)
print('!end!\n')

#判断元素是否存在
print(5 in s_a)
print(10 in s_b)
print('!end!\n')

# 并集 (或操作)
print(s_a | s_b)
print(s_a.union(s_b))
print('!end!\n')
# 交集(相同的元素) 与操作
print(s_a & s_b)
print(s_a.intersection(s_b)) # 生成一个新的set
print('!end!\n')

# 差集 A -  A并B
print(s_a - s_b)
print(s_a.difference(s_b))
print('!end!\n')

#对称差 (A|B) - (A & B) 异或操作
print(s_a ^ s_b)
print(s_a.symmetric_difference(s_b))
print('!end!\n')

#修改元素
s_a.add('x')
s_a.update([4,5,60,70]) #添加数组到set
print(s_a)
s_a.remove(70)
print(s_a)
print('!end!\n')
# s_a.remove(100) # 删除不存在的元素 系统自动报错 KeyError: 100
print(len(s_a))
print('!end!\n')

for i in s_a:
    print(i)
print('!end!\n')

控制台打印

Code list


1
{1: 'one', 2: 'two'}
[1, 2, 3]
!end!

3
4
!end!

[1, 2, 3, 4, 5, 6, 7, 8]
!end!

Empty
Empty
!end!

1
2
3
456
[1, 2, 3]
{1: 'one', 2: 'two'}
1
2
3
456
[1, 2, 3]
{1: 'one', 2: 'two'}
!end!


!end!


(1, 2)
(-1, -1)
!end!

range(0, 5)
0
1
2
3
4
[1, 3, [1, 2, 3]]
!end!

Code 字典 



{'a': 1, 'b': 2, 1: 'one', 2: 'two', 3: [1, 2, 3]}
!end!

1
one
[1, 2, 3]
!end!

False
True
!end!

4
{'a': 1, 'b': 2, 1: 'one', 2: 'two'}
!end!

1
2
one
two
1234
!end!

a 1
b 2
1 one
2 two
3 1234
!end!


dict_keys(['a', 'b', 1, 2, 3])
!end!

Code Set 

{1, 2, 3, 4, 5, 6}
{4, 5, 6, 7, 8, 9}
!end!

True
False
!end!

{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
!end!

{4, 5, 6}
{4, 5, 6}
!end!

{1, 2, 3}
{1, 2, 3}
!end!

{1, 2, 3, 7, 8, 9}
{1, 2, 3, 7, 8, 9}
!end!

{1, 2, 3, 4, 5, 6, 'x', 70, 60}
{1, 2, 3, 4, 5, 6, 'x', 60}
!end!

8
!end!

1
2
3
4
5
6
x
60
!end!


二、 切片
百度维基

切片是用特制刀具把生物体的组织或矿物切成的薄片。切片用来在显微镜下观察和研究。

自身理解

将一样东西切开。比如,把一块瘦肉切片,就切出了很多一片一片的肉片。

代码展示

# 二、 切片
"""
start : 从哪里开始
end :   到哪里结束
steps   不长是多少
>= start & < end
"""
print('二、 切片 \n')

# 切片
li = list(range(10))
print(li)
print(li[2:5]) #[3,4,5] 
print(li[:4]) #[0,1,2,3]
print(li[5:])
print(li[0:20:3]) #[0,3,6,9]
print('!end!\n')

#负值怎么处理
print(li[5:-2]) #[5,6,7]
print(li[9:0:-1])
print(li[9::-1])
print(li[9::-2])
print('!end!\n')

# 切片生成一个新的对象
print(li) #还是保持原样
re_li = li[::-1] #对一个数组进行快速的反转
print(re_li) 
print('!end!\n')

#列表推导
li = list(range(10))
print(li)

li = []
for i in range(20):
    if (i % 2) == 0:
        li.append(i) 
print(li)

li = [0] * 10
li[3] = 3
print(li) # 生成 10个0的数组
print('!end!\n')

# 推导
lis = [i * 2 for i in range(10)]
print(lis)

#二维数组
# li_2d = [[0] * 3] * 3 #这里做乘法的时候 都是用的同一个引用 这里是浅拷贝 不是深拷贝
# print(li_2d)
# li_2d[0][0] = 100
# print(li_2d)

li_2d = [[0] * 3 for i in range(3)]   #深拷贝
print(li_2d)
li_2d[0][0] = 100
print(li_2d)

s = {x for x in range(10) if x % 2 == 0}
print(s)
d = {x:x % 2 == 0 for x in range(10)}
print(d)
print('!end!\n')

控制台打印

二、 切片 

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4]
[0, 1, 2, 3]
[5, 6, 7, 8, 9]
[0, 3, 6, 9]
!end!

[5, 6, 7]
[9, 8, 7, 6, 5, 4, 3, 2, 1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
[9, 7, 5, 3, 1]
!end!

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
!end!

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[0, 0, 0, 3, 0, 0, 0, 0, 0, 0]
!end!

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[100, 0, 0], [0, 0, 0], [0, 0, 0]]
{0, 2, 4, 6, 8}
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
!end!

三、生成器
百度维基

生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。
调用该函数将返回一个可用于生成连续 x 值的生成器【Generator】
简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,
然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,
而生成器内的所有变量参数都会被保存下来供下一次使用。

自身理解

生成东西的器材。
在python里面,它表示计算才会被创建。用来节省空间。

代码展示

# 三、生成器
'''
用到的元素 才去计算
这个就是生成器
主要用于 惰性计算 (也就是需要的时候才会去生成)
列子 :斐波那契数列
      求x²
'''

# 平方表
print("三、生成器 \n")
print(type(range(10))) # range 其实就是定义一个生成器 可以不断调用next
square_table = []
for i in range(50000):
    square_table.append(i * i)
for i in range(10):
    print(square_table[i])
print('!end!\n')

# 生成器实现
square_generator = (x * x for x in range(50000))
for i in range(10):
    print(next(square_generator))
print('!end!\n')

# 斐波那契数列
def fib(limit):
    n,a,b = 0,0,1 
    while  n < limit:
        yield b # yield 类似一个可控的多线程
        a,b = b, a + b
        n += 1
    return 'done'

import traceback
f = fib(5)
print(type(f)) # 

print(next(f)) 
print(next(f))
print(next(f))
print(next(f))
print(next(f))
# print(next(f))
print('!end!\n')

# try:
#   print(next(f))
# except StopIteration:
#   traceback.print_exc()
# for i in fib(5):
#   print(i)

控制台打印

三、生成器 


0
1
4
9
16
25
36
49
64
81
!end!

0
1
4
9
16
25
36
49
64
81
!end!


1
1
2
3
5
!end!


四、迭代器
百度维基

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,
每个迭代器对象代表容器中的确定的地址。
迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:
那些行为上像迭代器的东西都可以叫做迭代器。
然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。

自身理解

自身没有理解
根据计算机所讲
可以被next()函数调用并不断返回下一个值的对象 称为迭代器:
Iterator(表示一个惰性计算)

代码展示

# 四、迭代器
'''
可以直接作用于 for循环的对象 统称为可迭代对象:Iterable
可以被next()函数调用并不断返回下一个值的对象 称为迭代器:Iterator(表示一个惰性计算)
'''
print("四、迭代器 \n")

from collections import Iterable
from collections import Iterator
# 判断一个对象 是不是可以迭代的
print(isinstance([1,2,3],Iterable))
print(isinstance({},Iterable))
print(isinstance(123,Iterable))
print(isinstance('abc',Iterable))
print('!end!\n')

# 判断一个迭代对象 是不是可以生产迭代器 
print(isinstance([1,2,3],Iterator))
print('!end!\n')

g = (x * x for x in range(10))
print(type(g))
print(isinstance(g,Iterable))
print('!end!\n')

for i in g:
    print(i)
print('!end!\n')

# 斐波那契数列 是一个迭代器
def fib(limit):
    n,a,b = 0,0,1
    while n < limit:
        yield b
        a,b = b, a + b
        n +=1
    return 'Done'

fi = fib(6)
print(type(fi))
print(isinstance(fi,Iterable))
print(isinstance(fi,Iterator))

for i in fi:
    print(i)
print('!end!\n')

控制台打印

四、迭代器 

True
True
False
True
!end!

False
!end!


True
!end!

0
1
4
9
16
25
36
49
64
81
!end!


True
True
1
1
2
3
5
8

作业 (于2018-03-22将提交到下面的百度云里面)
基本都是用数组
1、螺旋矩阵:给定一个 m * n 要素的矩阵。 按照螺旋顺序,返回该矩阵的所有要素
[[1,2,3],
[4,5,6],
[7,8,9]
]
应该返回[1,2,3,6,9,8,7,4,5]

2、用栈(使用list)实现队列:支持push(element),pop()和top()方法
    pop 和 top方法都应该返回第一个元素的值。比如执行以下操作序列:
    push(1),pop(),push(2),push(3),top(),pop()
    你应该返回1,2,和2。
3、矩阵转换: 给定矩阵A,令矩阵B里每个元素B[i][j]的值等A[0][0]到A[i][j]子矩阵元素的和
4、翻转单向链表
    class ListNode:
        def __init__(self,val,next = None):
            self.val = val
            self.next = next

代码:f557

明天将会更新→0004.Python基础入门班_第4课、面向对象基础

代码都是上传百度云

你可能感兴趣的:((2018-03-21)0003.Python基础入门班_第3课、容器以及容器的访问使用)