2.2 OrderedDict有序字典

  1. import collections
  2. dic = collections.OrderedDict()
  3. dic['k1'] = 'v1'
  4. dic['k2'] = 'v2'
  5. dic['k3'] = 'v3'
  6. print(dic)
  7. dic.move_to_end('k1') #将'k1'放到字典末尾
  8. print(dic)
  9.  
  10. #OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
  11. #OrderedDict([('k2', 'v2'), ('k3', 'v3'), ('k1', 'v1')])

move_to_end将指定元素放到最后

  1. import collections
  2. dic = collections.OrderedDict()
  3. dic['k1'] = 'v1'
  4. dic['k2'] = 'v2'
  5. dic['k3'] = 'v3'
  6. print(dic
  7.  
  8. dic.popitem()
  9. print(dic)
  10.  
  11. #OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
  12. #OrderedDict([('k1', 'v1'), ('k2', 'v2')])

popitem 移除最新添加的元素(后进先出)

  1. #移除指定元素,可将移除的元素赋值给自己
  2. import collections
  3. dic = collections.OrderedDict()
  4. dic['k1'] = 'v1'
  5. dic['k2'] = 'v2'
  6. dic['k3'] = 'v3'
  7. print(dic)
  8. dic.pop('k2')
  9. print(dic)
  10.  
  11. #OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
  12. #OrderedDict([('k1', 'v1'), ('k3', 'v3')])
  13.  
  14. import collections
  15. dic = collections.OrderedDict()
  16. dic['k1'] = 'v1'
  17. dic['k2'] = 'v2'
  18. dic['k3'] = 'v3'
  19. print(dic)
  20. ret = dic.pop('k2')
  21. print(ret) #将移除的元素赋值给变量
  22.  
  23. #OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
  24. #v2

pop移除指定元素

  1. import collections
  2. dic = collections.OrderedDict()
  3. dic['k1'] = 'v1'
  4. dic['k2'] = 'v2'
  5. dic['k3'] = 'v3'
  6. print(dic)
  7. dic.setdefault('k4', '') #setdefault设置默认值,如果对象后面不加参数默认为None
  8. print(dic)
  9.  
  10. #OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
  11. #OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3'), ('k4', '66')])

setdefault设置默认值

  1. import collections
  2. dic = collections.OrderedDict()
  3. dic['k1'] = 'v1'
  4. dic['k2'] = 'v2'
  5. dic['k3'] = 'v3'
  6. print(dic)
  7. dic.update({'k1':'v111', 'k10':'v10'})
  8. print(dic)
  9.  
  10. #OrderedDict([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')])
  11. #OrderedDict([('k1', 'v111'), ('k2', 'v2'), ('k3', 'v3'), ('k10', 'v10')])

update更新原有的数据

2.3 默认字典

  1. import collections
  2. dic = collections.defaultdict(list) #设置类型为列表类型
  3. dic['k1'].append('alex')
  4. print(dic)
  5.  
  6. #defaultdict(<class 'list'>, {'k1': ['alex']})

2.4可命令元组

  1. #可命令元组
  2. import collections
  3. MytupleClass = collections.namedtuple('MytupleClass',['x', 'y', 'z']) #创建一个类,类名为MytupleClass
  4. obj = MytupleClass(11,22,33)
  5. print(obj.x) #直接通过命令元素去访问元组对应的元素
  6. print(obj[0]) #等同于上面这种方式,但是没有上面这种方式可读性强
  7. print(obj.y)
  8. print(obj.z)
  9.  
  10. #
  11. #
  12. #
  13. #

2.5 deque双向队列

  1. import collections
  2. newdeque = collections.deque(['alex', 'eric', 'jack']) #创建一个双向队列
  3. print(newdeque) #deque(['alex', 'eric', 'jack'])
  4.  
  5. newdeque.append('') #追加一个元素到队列
  6. print(newdeque) #deque(['alex', 'eric', 'jack', '11'])
  7.  
  8. newdeque.appendleft('') #追加一个元素到左侧
  9. print(newdeque) #deque(['22', 'alex', 'eric', 'jack', '11'])
  10.  
  11. newc = newdeque.count('alex') #对队列里某个元素进行计数
  12. print(newc) #
  13.  
  14. newdeque.extend(['', '']) #扩展队列元素
  15. print(newdeque) #deque(['22', 'alex', 'eric', 'jack', '11', '44', '55'])
  16.  
  17. newdeque.extendleft(['aa', 'bb']) #从左侧进行扩展
  18. print(newdeque) #deque(['bb', 'aa', '22', 'alex', 'eric', 'jack', '11', '44', '55'])
  19.  
  20. newdeque.insert(2, 'haha') #插入到下标2的位置
  21. print(newdeque) #deque(['alex', 'eric', 'haha', 'jack'])
  22.  
  23. newdeque.reverse() #顺序反转
  24. print(newdeque) #deque(['jack', 'haha', 'eric', 'alex'])
  25.  
  26. newdeque.rotate(3) #将队列末尾3个元素反转到队列左侧
  27. print(newdeque) #deque(['haha', 'eric', 'alex', 'jack'])

2.5.1 deque双向队列,该对象与collections的deque实质是完全一样的效果,这里就不作演示了,使用方法如下:

  1. import queue
  2. q = queue.Queue(['a', 'b'])
  1. import queue
  2. newdeque = queue.Queue(3) #设置队列长度为3,也就是队列里面只有3个任务,如果不设置队列长度,就可以有
  3. #无限个任务,直到内存耗尽
  4. newdeque.put(['', '']) #放入第一个任务
  5. get1 = newdeque.get() #获取第一个任务
  6. print(get1) #['1', '2']
  7.  
  8. newdeque.put(['a', 'b']) #放入第二个任务
  9. get2 = newdeque.get() #获取第二个任务
  10. print(get2) #['a', 'b']
  11.  
  12. isempty = newdeque.empty() #判断队列是否为空
  13. print(isempty) # True
  14.  
  15. isfull = newdeque.full() #判断多列是否已经满了
  16. print(isfull) #False

queue 单项队列

三.深浅拷贝

  1. import copy #导入拷贝模块
  2. copy.copy() #浅拷贝
  3. copy.deepcopy() #深拷贝
  4. name = 'alex'
  5. copyname = name #赋值
  1. #浅拷贝
  2. import copy
  3. a1 = [10,'b1',[111,112],'ha',]
  4. a2 = copy.copy(a1) #浅拷贝
  5. print(a1)
  6. print(a2)
  7.  
  8. a1[1] = 11 #改变a1的值
  9. a1[2][0] = 1111 #改变a1内嵌列表的值,将a1的第2个下标的第0个下标值改变
  10. print(a1)
  11. print(a2)
  12. print(id(a1))
  13. print(id(a2))
  14. print(id(a1[2][0]))
  15. print(id(a2[2][0]))
  16.  
  17. #[10, 'b1', [111, 112], 'ha']
  18. #[10, 'b1', [111, 112], 'ha']
  19. #通过下面的对比,发现浅拷贝对于内嵌多层数据类型的操作,如果多层数据类型值改变,浅拷贝的对象也会跟着改变
  20. #[10, 11, [1111, 112], 'ha']
  21. #[10, 'b1', [1111, 112], 'ha']
  22.  
  23. #12542664
  24. #12543688
  25.  
  26. #7183888
  27. #7183888
  1. #深拷贝
  2. import copy
  3. a1 = [10,'b1',[111,112],'ha',]
  4. a2 = copy.deepcopy(a1) #深拷贝
  5. print(a1)
  6. print(a2)
  7.  
  8. a1[1] = 11 #改变a1的值
  9. a1[2][0] = 1111 #改变a1内嵌列表的值,将a1的第2个下标的第0个下标值改变
  10. print(a1)
  11. print(a2)
  12. print(id(a1))
  13. print(id(a2))
  14. print(id(a1[2][0]))
  15. print(id(a2[2][0]))
  16.  
  17. #[10, 'b1', [111, 112], 'ha']
  18. #[10, 'b1', [111, 112], 'ha']
  19. #结合上面的例子进行对比发现,对应深层拷贝,内嵌多层的数据类型的值,被改变,不会影响到另一方拷贝或被拷贝的对象
  20. #[10, 11, [1111, 112], 'ha']
  21. #[10, 'b1', [111, 112], 'ha']
  22. #19030728
  23. #19031752
  24. #7118352
  25. #1723483792

四.函数

函数定义主要有如下要点

1.def:表示函数的关键字

2.函数名:函数的名称,日后可根据函数名调用函数

3.函数体:函数中进行一系列的逻辑计算。

4.参数:为函数提供数据

5.返回值:当函数中执行完成后,可以给调用者返回数据

以上要点中,比较重要的有参数和返回值

  1. def func(): #创建一个函数,没有接收参数
  2. print('hello')
  3.  
  4. func() #直接执行函数
  5. #执行结果 hello
  6.  
  7. foo = func #创建一个对象
  8. foo() #执行对象
  9. #执行结果 hello
  10.  
  11. def func(arg): #传入一个参数
  12. print('hello %s' % arg)
  13.  
  14. func('laiying') #执行结果输出 hello laiying
  15.  
  16. def func(arg1,arg2): #传入两个参数
  17. print('hello %s, %s' % (arg1, arg2))
  18.  
  19. func('laiying','good') #执行结果输出 hello laiying, good
  20.  
  21. def func(*args): #动态参数,多个参数,可以为空
  22. print('hello %s' % (''.join(args)))
  23.  
  24. func('laiying', '很棒', 'very good') #执行结果输出hello laiying很棒very good
  25.  
  26. #以下两种方式得到的效果相同
  27. def show(*args,**kwargs):
  28. print(args,type(args))
  29. print(kwargs,type(kwargs))
  30. show(11,22,33, n1= 88,n2='alex')
  31. #结果输出(11, 22, 33) <class 'tuple'>{'n2': 'alex', 'n1': 88} <class 'dict'>
  32.  
  33. def show(*args,**kwargs):
  34. print(args,type(args))
  35. print(kwargs,type(kwargs))
  36. a = [11, 22, 33, ]
  37. b = {'n1':88, 'n2':'alex'}
  38. show(*a, **b)
  39. #结果输出(11, 22, 33) <class 'tuple'>{'n2': 'alex', 'n1': 88} <class 'dict'>

函数参数

1.形参变量只有在被调用时才分配内存单元, 在调用结束时,即可释放所分配的内存单元,因此,形参只在函数内部有效,

函数调用结束返回时主调用函数后则不能在使用该形参变量

2.实参可以是常量,变量,表达试,函数等,无论实参是何类型的量,在进行函数调用时,它们都必须有确定的值,

以便把这些值传送给行参,因此应预先用赋值,输入等办法使参数获得确定值

3.位置参数和关键字(标准调用:实参与行参位置必须一一对应,关键字调用:位置无需固定)

4.默认参数

5.参数组 *args 以元组的形式传入参数  **kwagrs以字典的形式传入参数

以上参数是以一个整体,元组,字典的方式传入,如果需要一次传入多个元素,但是又可以分开一个一个传入,可以使用以下方式

参数的传入规则  (位置参数,关键字参数)---------默认参数------------参数组

五.嵌套函数

  1. # 创建嵌套函数
  2. NAME = 'alex'
  3. def global_test(): # 第一层定义的函数
  4. name = 'rain'
  5. print("global_test: ",name)
  6. def local_test(): # 第二层定义的函数
  7. name = 'jack'
  8. print("local_test: ",name)
  9. def test(): # 第三成第一的函数
  10. name = 'ying'
  11. print("test: ",name)
  12.  
  13. test()
  14. local_test()
  15. global_test()
  16.  
  17. #执行结果
  18. global_test: rain
  19. local_test: jack
  20. test: ying
  21.  
  22. #通过以上结果我们可以看出,嵌套函数的执行顺序是,先执行外层函数,然后依次执行内层中的嵌套函数, 内层中的函数不可在其他地方调用,只能在该函数中调用

六:函数中global与nonlocal的作用

通过以上截图可以看出,只要通过global关键字将变量改为了全局变量,那么以前的那个全局变量就会被覆盖,以后在执行该变量时,执行的就是通过global从新定义的这个全局变量,

全局变量的范围就是整个程序

通过以上截图可以看出nonloacl关键字的作用就是,将上一层的变量修改为当前变量,只对上一层生效,不能对其它层生效

六.递归

在函数内部,可以调用其他函数,如果一个函数在内部调用自己本身,这个函数就是递归函数

  1. def calc(n):
  2. print(n)
  3. if int(n/2) == 0:
  4. return n
  5. return calc(int(n/2))
  6. calc(10)
  7.  
  8. #执行结果
  9. 10
  10. 5
  11. 2
  12. 1
  13.  
  14. #根据以上结果,我们来分析一下执行的流程
  15. 1.calc这个函数传入一个参数n10
  16. 2.打印这个函数
  17. 3.if判断n是不是等0,如果n==0就终止这个函数,并给一个返回值n
  18. 4.终止自身函数的运行,然后调用自己,计算n/2,并将这个值给返回。
  19.  
  20. 5.重复以上执行流程,一直到n/2==0,就终止这个函数本身的运行,并return一个返回值n

递归问路

  1. person_list = ["alex","jakc","rain"]
  2. def ask_way(person_list):
  3. print('-'*60)
  4. if len(person_list) == 0:
  5. return "没有人知道"
  6. person = person_list.pop(0)
  7. if person == "rain":
  8. return "%s说:我知道,圆明园在海淀,下地铁就到" %person
  9. print("hi [%s],请问圆明园在什么地方" %person)
  10. print("%s回答道:我不知道,你等在,我帮你问下一个人%s"%(person,person_list))
  11. res = ask_way(person_list)
  12. print("%s问的结果是:%res" %(person,res))
  13. return res
  14. res = ask_way(person_list)
  15. print(res)
  16.  
  17. ###########执行结果##########
  18. ------------------------------------------------------------
  19. hi [alex],请问圆明园在什么地方
  20. alex回答道:我不知道,你等在,我帮你问下一个人['jakc', 'rain']
  21. ------------------------------------------------------------
  22. hi [jakc],请问圆明园在什么地方
  23. jakc回答道:我不知道,你等在,我帮你问下一个人['rain']
  24. ------------------------------------------------------------
  25. jakc问的结果是:'rain说:我知道,圆明园在海淀,下地铁就到'es
  26. alex问的结果是:'rain说:我知道,圆明园在海淀,下地铁就到'es
  27. rain说:我知道,圆明园在海淀,下地铁就到

递归特性

1.必须要有一个明确的结束条件

2.每次进入更深一次递归时,问题规模相比上次递归都应有所减少

3.递归效率不高,递归层次过多会导致栈溢出

(在计算机中,函数调用是通过栈(stack)这个数据结果实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧,

由于栈的大小不是无限的,所以,递归调用的次数过多,会会导致栈溢出)

七.lambda & map

lambda书写格式:参数:表达式   直接得出一个结果,赋值给一个变量

lamdba存在的意义是对简单函数的简洁表达

  1. func = lambda a:a+1 #创建形式参数a
  2. ret = func(1) #函数内容,a+1 并把结果retun回去
  3.  
  4. print(ret)
  5. #打印输出 2
  6.  
  7. map1 = map(lambda x:x+100, [11,22,33]) #map(函数,'参数')
  8. print(list(map1))
  9. #结果输出 [111, 122, 133] ,python2.x可以直接看到结果,python3.x需要转换成list才能看到结果

初识Python第三天(二)的更多相关文章

  1. python第三十二课——队列

    队列:满足特点 --> 先进先出,类似于我们生活中的买票.安检 [注意] 对于队列而言:python中有为其封装特定的函数,在collections模块中的deque函数就可以获取一个队列对象; ...

  2. 初识Python(三)

    一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在后续的代码中使用: 外层变量,可以被内层变量使用:内层变量,也可以被外层变量使用: 如下示例: #!/usr/bin/env pyt ...

  3. 初识Python第三天(一)

    一.set集合 set是一个无序且不重复的元素集合 print(dir(set)) #['__and__', '__class__', '__contains__', '__delattr__', ' ...

  4. python第三十二课——栈

    栈:满足特点 --> 先进后出,类似于我们生活中的子弹夹 [注意] 对于栈结构而言:python中没有为其封装特定的函数,我们可以使用list(列表)来模拟栈的特点 使用list对象来模拟栈结构 ...

  5. 笨办法学Python(三十二)

    习题 32: 循环和列表 现在你应该有能力写更有趣的程序出来了.如果你能一直跟得上,你应该已经看出将“if 语句”和“布尔表达式”结合起来可以让程序作出一些智能化的事情. 然而,我们的程序还需要能很快 ...

  6. python学习 (三十二) 异常处理

    1 异常: def exceptionHandling(): try: a = b = d = a / b print(d) except ZeroDivisionError as ex: print ...

  7. 孤荷凌寒自学python第三十八天初识python的线程控制

     孤荷凌寒自学python第三十八天初识python的线程控制 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.线程 在操作系统中存在着很多的可执行的应用程序,每个应用程序启动后,就可以看 ...

  8. 孤荷凌寒自学python第三十三天python的文件操作初识

     孤荷凌寒自学python第三十三天python的文件操作初识 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天开始自学python的普通 文件操作部分的内容. 一.python的文件打开 ...

  9. 初识python(二)

    初识python(二) 1.变量 变量:把程序运行的中间结果临时的存在内存里,以便后续的代码调用. 1.1 声明变量: #!/usr/bin/env python # -*- coding: utf- ...

随机推荐

  1. JAVA生成二维码图片代码

    首先需要导入 QRCode.jar 包 下载地址看这里   http://pan.baidu.com/s/1o6qRFqM import java.awt.Color;import java.awt. ...

  2. 第1章 Bootstrap介绍

    学习网址:http://www.bootcss.com/ 下载网址:http://v3.bootcss.com/ 下载后一共三个文件夹 css js fonts 引入的文件 <link rel= ...

  3. c#语句 类

    知识点: 1.string类 2.Math类 3.DateTime  获取时间 for穷举 1.羽毛球拍15元,球3元,水2元.现有200元,每种至少买一个,共有多少种可能.

  4. shell 常用正则

    shell常用正则表达式   “^\d+$” //非负整数(正整数 + 0)   “^[0-9]*[1-9][0-9]*$” //正整数   “^((-\d+)|(0+))$” //非正整数(负整数 ...

  5. XML于JSON

    XML:可拓展的标记语言(跨平台数据表现)用于保存数据 XML:标记需要关闭 :单根性 .NET中DOM常用对象: XmlDocument :一个XML文档 XmlNode:xml中的单个节点 Xml ...

  6. 杭电ACM 1178

    #include<stdio.h>#include<string.h>#include<math.h>#include<ctype.h>#include ...

  7. DOM模型有三种

    <!-- DOM模型有三种: DOM level 1:将HTML文档封装成对象. DOM level 2:在level 1基础加入新功能,比如解析名称空间. //<html xmlns=& ...

  8. windows 快捷键

    Windows 系统 f6  在同一个应用的不同窗口进行切换 ctrl-shift 拖动,创建文件快捷方式 shift 右键点击文件 可以出现复制路径的菜单 WIN键组合键 Windows Key + ...

  9. JSTL标签出错:<c:forEach var="book" items="${requestScope.books}" varStatus="status">

    今天在运行书里的JSTL标签代码的时候出错,总结一下: 问题1.The JSP specification requires that an attribute name is preceded by ...

  10. .Net using,string.Empty初探

    前两天够哦年公司培训,讲了编码优化.现在初步总结下:(有些不大确定的就不讲了) 多次字符串拼接(特别是循环内),宜用stringBuilder.Append()方法,少用字符串+,至于string.F ...