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]
    • ...

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
  • **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. 可变类型和不可变类型,内部存储规则:

优质内容筛选与推荐>>
1、NOIP2019游记 && NOIP2020游记
2、非web环境的注解配置的spring项目应用(non-web, Spring-data-jpa, JavaConfig, Java Application, Maven, AnnotationConfigApplicationContext)
3、leetcode 110. 平衡二叉树(Balanced Binary Tree)
4、继续Django
5、LeetCode 203. 移除链表元素


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号