python基础—迭代器 | 切片


这里有很多python特有的东西,非常有意思,以前只接触过C, C++, Java, Javascript,没想到还可以这样玩


# ------------------slice-------------------- #
# slice 切片 从数组切出另一个数组
li = list(range(10))
print(li)   # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# [start, end, step]  || (start - end) 要和 step的正负号一致

print(li[2:5])	# [2, 3, 4]
print(li[:4])	# [0, 1, 2, 3]
print(li[5:])	# [5, 6, 7, 8, 9]
print(li[0:20:3])        # [0, 3, 6, 9]


# how about minus
print(li[5:-2])            # [5, 6, 7]
print(li[9:0:-1])	# [9, 8, 7, 6, 5, 4, 3, 2, 1]
print(li[9:0:1])	# []
print(li[9::-1])	# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(li[::-2])	# [9, 7, 5, 3, 1]

# a new object
print(li)
re_li = li[::-1]            # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(re_li)


# ------------------comprehension-------------------- #
# comprehension  推导列表
# simple case
li = []
for i in range(10):
	li.append(i) 
print(li)

li = list(range(10)):
        print(li)

li  = [1] * 10
print(li)

# 浅拷贝
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)

li = (x for x in range(10))
print(type(li))         # generator
print(li)                  # generator object
      
for i in range(10):  # way1 
      print(next(li))
      
for i in li:                # way2
      print(i)

      
li = [x for x in range(10)]    
print(type(li))         # list
print(li)                  # [1, 2, 3, 4]

li =  {x for x in range(3)}
print(type(li))         # set
print(li)                  # {0, 1, 2}

s = {x for x in range(10)  if x%2==0 }
print(type(s))     # set
print(s)              # {0, 8, 2, 4, 6}

s = [ x%2==0 for x in range(10)]
print(type(s))     # list
print(s)              # [True, False, Ture, False,Ture, False, Ture, False, Ture, False]

d = {x: x % 2 == 0 for x in range(10)}
print(type(d))    # list
print(d)             # {0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}

# so  'x for x in range(10)'  is a comprehension


# generator 将真正的计算推迟到使用时  不一次性生成很多元素,省内存
# 2.7 版本时一次性生成100W个数字,在3.5版本并不是真正生成100W个数字而是在next取值时才生成
print(type(range(10)))   # type  

# 平方表
square_table = []
for i in range(50000):
	square_table.append(i * i)
for i in range(5):
	print(square_table[i])

square_generator = ( x * x for x in range(50000))
print(type(square_generator))   # generator

for i in range(5):
	print(next(square_generator))

def fib(limit):
	n, a, b = 0 , 0 , 1
	while n < limit:
		yield b
		a, b  = b, a + b
		n += 1
	pass
import traceback

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


# Iterable  Iterator
# 可迭代 和 迭代器不一样的概念, 可迭代表示可以用for循环, 而迭代器是用来使用next()不断返回下一个值,采用惰性计算
# 生成器一定是迭代器  使用一个生成一个 看下面的fib例子
from collections import Iterable
from collections import Iterator

print(isinstance([1,2,3], Iterable))	                # True
print(isinstance({}, Iterable))			# True
print(isinstance(123, Iterable))		# False
print(isinstance('abc', Iterable))		# True

print(isinstance([1, 2, 3], Iterator))                         # False
 
g = (x * x for x in range(10))
print(type(g))		# <type 'generator'> 
print(isinstance(g, Iterable))	# True
print(isinstance(g, Iterator))	# True
for i in g:
	print(i)

def fib(limit):
	n, a, b = 0 , 0 , 1
	while n < limit:
		yield b
		a, b  = b, a + b
		n += 1
	pass
f = fib(5)
print(type(f))
print(isinstance(f, Iterable))   # True
print(isinstance(f, Iterator))	# True
for i in f:
	print(i)



I’m fish, I'm on.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值