python lesson two

遍历列表:

>>> 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

猜你喜欢

转载自blog.csdn.net/qq_43011640/article/details/88804494
今日推荐