Day5&Day6 Python学习笔记&关键注意点
Part 1:Python学习笔记
===================
5.5. 迭代
5.5.1.迭代协议
- 方法__next__()
- 示例:1. f = open('data.txt',encoding='utf-8');
- 2. f.__next__()
- 全局函数next()
- 示例:1. f = open('data.txt',encoding='utf-8');
- 2. next(f)
5.5.2. 迭代工具 for ...; 推导; map...
- 迭代器对象
- 已经实现
- 用 iter(f) is f 来判断是不是已经应用了迭代器的功能, True表示已经实现了,可以直接调用__next__()或者next()了
- 已经实现
- 可迭代对象
- 额外的加一个方法. iter()--> --iter__() 用于生成迭代器
- 示例用for
- l = [1,2,3]
- res = []
- for x in l:
- res.append(x**2)
- Type :res
- Result: [1,4,9]
- 示例不用for
- l = [1,2,3]
- res = []
- i = iter(l)
- While True: try:
- x = res.append(next(i)**2)
- except StopIteration:
- break
- Type: res
- Result: [1,4,9,1,4,9]
- 内置可迭代对象
- range()
- r = range(1,20)
- type(r) --> <class 'range'>
- for x in range(1,11): print(x) -
- -> 1 2 3 4 5 6 7 8 9 10
- zip()
- result = zip(['x','y','z'],[1,2,3])
- for x in result:
- print(x)
- --> ('x',1)
- ('y',2)
- ('z',3)
- map()
- def double_number(x):
- return x*2 l = [1,2,3,4,5]
- result = list(map(double_number,l))
- result
- --> [2,4,6,8,10]
- ...
- range()
6.函数
6.1. 使用函数目的
6.1.1.最大化代码重用
6.1.2.最小化代码冗余
6.1.3.过程分解
6.2. 定义
6.2.1.def 方法名(参数1,...):函数体
- 示例1
- #定义函数
- def read_book():
- print('拿到一本书')
- print('看书')
- print('收起')
- #调用函数
- read_book()
- -->
- 拿到一本书
- 看书
- 收起
- 示例2
- def learning(name,course,start,end):
- print('{}报名课程:《{}》'.format(name,course))
- print('从第{}节学习到第{}节'.format(start,end))
- print('{}学习结束'.format(name))
- learning('Tom','Python入门',1,3)
- 示例3
- def add_number(x,y):
- result = x+y
- return result
- a = 10
- result = a+add_number(5,3)
- print(result)
- --> 18
- 示例4
- def intersect(seq1,seq2):
- res = []
- for x in seq1:
- if x in seq2:
- res.append(x)
- return res
- s1 = 'uke.cc'
- s2 = 'youpinketang.com'
- l = intersect(s1,s2)
- print(l)
- -->['u','k','e','.','c','c']
6.3.调用
6.3.1.函数名(实际参数)
6.4.变量作用域
6.4.1.Built-in
6.4.2.全局 global
6.4.3. 封装 Enclousure 函数套函数
- 示例1
- def func():
- x = 100
- def nested():
- x = 99
- print(x)
- print(x)
- func()
- -->100
- 示例2
- def func():
- x = 100
- def nested():
- x = 99
- print(x)
- nested()
- print(x)
- func()
- --> 99
- 100
- nonlocal
6.4.4.本地 local
6.4.5.示例1
- x = 55
- def func():
- x = 99
- print(x)
- print('全局x:',x)
- print('函数内x:')
- func()
- --> 全局x:55
- 函数内x: 99
6.4.6.示例2
- x = 55
- def func():
- global x
- x = 99
- print(x)
- print('全局x:',x)
- print('函数内x:')
- func()
- print('全局x:',x)
- --> 全局x:55
- 函数内x: 99
- 全局x:99
6.5. 参数
6.5.1.示例1
- def change_number(x):
- x +=10
- x = 5
- print('x={}'.format(x))
- change_number(x)
- print('x={}'.format(x))
- --> 5 5
6.5.2. 示例2
- def change_number(x):
- x +=10
- return x
- x = 5
- print('x={}'.format(x))
- change_number(x)
- print('x={}'.format(x))
- --> 5 5
6.5.3. 总结示例发生原因:不可改变的类型(5是int型),当你向一个函数传值时,先做出一个副本出来,再传递到函数内,函数内做什么,都不会影响到原来的值,所以有没有return都对值没有影响。
- 示例可改变类型
- def change_list(l):
- l[0] = 99
- l = ['uke.cc','codeclassroom.com','youpinketang.com']
- print('原始列表:',l)
- change_list(l)
- print('操作后列表:',l)
- --> 原始列表:['uke.cc','codeclassroom.com','youpinketang.com']
- 操作后列表: [99,'codeclassroom.com','youpinketang.com']
- 示例可改变类型如何操作不影响原始值(加copy())
- def change_list(l):
- l[0] = 99
- l = ['uke.cc','codeclassroom.com','youpinketang.com']
- print('原始列表:',l)
- change_list(l.copy())
- print('操作后列表:',l)
- --> 原始列表:['uke.cc','codeclassroom.com','youpinketang.com']
- 操作后列表: ['uke.cc','codeclassroom.com','youpinketang.com']
6.5.4. 传递
- 不可变类型,传递副本给函数,函数内操作不影响原始值
- 可变类型,传递地址引用,函数内操作可能会影响原始值
6.5.5.匹配
- 位置匹配
- •示例
- def func(a,b,c):
- print(a,b,c)
- func(1,2,3)
- func('a','b','c')
- func([1,2,3],(5,6),{'a':1,'b':2})
- •示例
- 关键字匹配
- 默认值(调用时省略传值)
- 示例
- def func(a,b=2,c=3):
- print(a,b,c)
- func(1)
- --> 1 2 3
- 示例
- *args 任意数量参数(接受一个type)
- 示例1
- def avg(*scores):
- return sum(scores) / len(scores)
- result = avg(98.2,88.1,70,65)
- print(result)
- --> 80.325
- 示例2
- def avg(*scores):
- return sum(scores) / len(scores)
- scores = (88,89,90)
- result = avg(*scores)
- print(result)
- --> 89.0
- 示例1
- **kwargs (接受一个字典表)
- 示例
- def display(**employee):
- print(employee)
- display(name='tom',age=22,job='dev')
- --> {name:'tom',job:'dev',age:22}
- 示例
6.6.Lambda 表达式
6.6.1.定义匿名函数
- 示例
- def hello(name):
- print(name)
- f = lambda name: print(name)
- f('tom')
- --> tom
6.6.2.基本格式
- Lambda 参数1, ...:函数
- 示例
- def hello_chinese(name):
- print('你好:',name)
- def hello_english(name):
- print('Hello:',name)
- while True:
- name = input('请输入您的姓名:\n')
- if name == 'stop':
- break
- language = input ('请选择语言:\n c-->中文版\n e-->英文版\n j --> 日文版\n')
- if language == 'c':
- action = hello_chinese
- elif language == 'e':
- action = hello_english
- elif language == 'j':
- action = lambda name: print ('日文',name)
- action(name)
- 示例
6.7.高级工具
6.7.1.推导
- 示例
- l = list(range(1,21))
- result = []
- result = [x for x in l if x % 2 ==0]
- print(result)
6.7.2. 循环
- 示例
- l = list(range(1,21))
- result = []
- for n in l:
- if n%2== 0:
- result.append(n)
6.7.3.map(函数,可迭代对象)
- 示例
- l = list(range(1,21))
- res = []
- def add_number(x):
- return x+5
- res = list(map(add_number,l))
- print(res)
6.7.4.filter(函数,可迭代对象)
- 示例
- l = list(range(1,11))
- def even_number(x):
- return x % 2 == 0
- res = list(filter(even_number,l))
- print(res)
Part 2:Python学习注意点
=====================
1. 可迭代对象占用内存少和列表的区别(列表全部读到内存中去)
2. 可变类型和不可变类型,内部存储规则:

浙公网安备 33010602011771号