遍历列表:
>>> code = ['python','c++','java','php']
>>> for v in code:
... print("编程语言:{}".format(v))
...
编程语言:python
编程语言:c++
编程语言:java
编程语言:php
遍历索引和值:
enumerate()遍历索引和值
>>> for k,v in enumerate(city):
... print(k,v)
...
0 北京
1 上海
2 天津
3 重庆
省略索引
>>> for _,v in enumerate(city):
... print(v)
...
北京
上海
天津
重庆
zip()组合多个元组
>>> name = ("张三","李四","王五")
>>> age = (18,20,22)
>>> sex = ("男","女","女")
>>> zip(name,age,sex)
<zip object at 0x10be85248>
>>> list(zip(name,age,sex))
[('张三', 18, '男'), ('李四', 20, '女'), ('王五', 22, '女')]
>>> for v in zip(name,age,sex):
... print("姓名:{};年龄:{};性别:{}".format(v[0],v[1],v[2]))
...
姓名:张三;年龄:18;性别:男
姓名:李四;年龄:20;性别:女
姓名:王五;年龄:22;性别:女
for循环推导生成列表
生成0~9的平方列表
>>> num = [v**2 for v in range(0,10)]
>>> num
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
嵌套for循环推导
>>> num1 = [1,2,3,4,5]
>>> num2 = [6,7,8,9,10]
>>> [a * b for a in num1 for b in num2]
[6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 21, 24, 27, 30, 24, 28, 32, 36, 40, 30, 35, 40, 45, 50]
嵌套if语句推导
>>> num = [v for v in range(0,10) if v % 2 == 0]
>>> num
[0, 2, 4, 6, 8]
>>> num = [v for v in range(0,10) if v % 2 == 1]
>>> num
[1, 3, 5, 7, 9]
迭代器
是访问集合元素的一种方式,迭代器是一个可以记住遍历的位置的对象
生成器
为什么使用生成器:创建一个包含元素很大的普通列表,占用内存大,浪费存储空间,受到内存限制,普
通列表的容量是有限的;而生成器是一种特殊的迭代器,能够很好的记录遍历位置,占用内存小,是一种非常好的解决方案。
查看对象占用的空间大小
>>> import sys
>>> num = [v for v in range(1,10000001)]
>>> sys.getsizeof(num)
81528056
>>> num = (v for v in range(1,10000001))
>>> sys.getsizeof(num)
88
使用()创建一个生成器,访问元素
>>> num = (v**2 for v in range(0,6))
>>> num
<generator object <genexpr> at 0x102653c50>
>>> next(num)
0
>>> next(num)
1
>>> next(num)
4
>>> next(num)
9
>>> next(num)
16
>>> next(num)
25
>>> next(num)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
使用函数和yield定义生成器
yield定义生成器[每次调用next()的时候执行,遇到yield语句返回]
>>> def number():
... print("num 1")
... yield 1
... print("num 2")
... yield 2
... print("num 3")
... yield 3
...
>>> num = number()
>>> next(num)
num 1
1
>>> next(num)
num 2
2
>>> next(num)
num 3
3
yield生成斐波拉契数列
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
>>> def fib(num):
... n,a,b = 0,0,1
... while n < num:
... yield b
... a,b = b,a+b
... n += 1
... return "ok"
...
>>> a = fib(10)
>>> while True:
... try:
... print(next(a))
... except StopIteration:
... break
...
1
1
2
3
5
8
13
21
34
55
不定长参数
使用*传递未命名的不定长参数
>>> def sum(*num):
... print(num)
...
>>> sum(1,2,3,4,5,6,7,8)
(1, 2, 3, 4, 5, 6, 7, 8)
>>> sum(1,2,3,4)
(1, 2, 3, 4)
使用**传递有命名的不定长参数
>>> def studentinfo(**s):
... print(s['name'],s['age'],s['sex'])
...
>>> studentinfo(age=20,name="李四",sex="女")
李四 20 女
>>> def studentinfo(**s):
... print(s)
...
>>> studentinfo(age=20,name="李四",sex="女")
{'age': 20, 'name': '李四', 'sex': '女'}
两种不定长混参数合使用
>>> def studentinfo(*n,**s):
... print(n,s)
...
>>> studentinfo(1,2,3,name="张三",age="18",sex="男")
(1, 2, 3) {'name': '张三', 'age': '18', 'sex': '男'}
变量作用域
Local:局部作用域
Enclosing:闭包函数外的函数中
Global:全局作用域
Built-in:内建作用域
以L–>E–>G–>B的规则查找
a = int(2.9) # 内建作用域
b = 0 # 全局作用域
def outer():
c = 1 # 闭包函数外的函数中
def inner():
d = 2 # 局部作用域
global 和 nonlocal关键字
将内部作用域修改为外部
global
num = 1
def func1():
global num #需要使用global关键字声明
print(num)
num = 123
print(num)
func1()
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
print(num)
inner()
print(num)
outer()
、递归函数
概念:如果一个函数在内部调用自身本身,这个函数就是递归函数
计算1到5的阶乘
>>> def sum(n):
... if n == 1:
... return 1
... return n*sum(n-1)
...
>>> sum(1)
1
>>> sum(2)
2
>>> sum(3)
6
>>> sum(4)
24
>>> sum(5)
120
Form