My way to Python - Day03

列表和字典的赋值

1 dict1 = {}
2 dict1[‘k1‘] = ‘v1‘
3
4 list1 = []
5 list1.append(‘v1‘)


集合系列

1,计数器

 1 Python 2.7.6 (default, Mar 22 2014, 22:59:56)
 2 [GCC 4.8.2] on linux2
 3 Type "help", "copyright", "credits" or "license" for more information.
 4 >>> import collections
 5 >>> c1 = collections.Counter()
 6 >>> str1 = ‘fujafksabfaskfjaslfl jshjfkk fhsfj hfajsjfsk fj‘
 7 >>> c1 = collections.Counter(str1)
 8 >>> c1  # 对于字符串操作的结果是:为每个出现的字符计数
 9 Counter({‘f‘: 11, ‘j‘: 8, ‘s‘: 7, ‘a‘: 5, ‘k‘: 5, ‘ ‘: 4, ‘h‘: 3, ‘l‘: 2, ‘b‘: 1, ‘u‘: 1})
10 >>> list1 = [11,22,22,33,33,33,44,44,44,44]
11 >>> c1 = collections.Counter(list1)
12 >>> c1  # 对于列表操作的结果是:为每个出现的元素计数
13 Counter({44: 4, 33: 3, 22: 2, 11: 1})
14 >>> 


2,有序字典 orderedDict

     有序字典在使用上跟普通字典是一样的,只是在内部实现的数据结构上有所区别。

有序字典在内部实现了一个列表,用来存储字典的key;由于列表是有序的,所以字典也就变为有序了。

因此有序字典可以通过key的下标进行取值。

orderedDict也可以做嵌套。



3,默认字典 defaultdict

     为字典里的value设置默认的类型

# 1,普通字典的方式

1 dic ={}
2 dic = {‘k1‘:[]}      # → 这两行等同于下例中的一行(#←)
3 dic[‘k1‘].append(1)  # → 这两行等同于下例中的一行(#←)


# 2,默认字典的方式

1 from collections import defaultdict
2 dic = collections.defaultdict(list)   # ←
3 dic[‘k1‘].append(1)

默认字典操作样例:

 1 >>> from collections import defaultdict  # 使用默认字典,需要先导入defaultdict
 2 >>> dic = {}
 3 >>> dic = collections.defaultdict(list)  # 创建一个默认字典对象,把字典的value的默认类型置为列表
 4 >>> dic[‘k1‘].append(1) # 向字典中添加一个key k1<list类型>,并向k1中append一个元素1
 5 >>> dic
 6 defaultdict(<type ‘list‘>, {‘k1‘: [1]})
 7 >>>
 8 >>> dic1 = {‘k1‘:1}
 9 >>> dic1
10 {‘k1‘: 1}
11 >>>
12 >>> dic1 = collections.defaultdict(list)
13 >>> dic1
14 defaultdict(<type ‘list‘>, {})
15 >>>
16 >>> dic1.append(22)  # 直接对dict1做append操作会报错,因为字典不能通过append进行赋值
17 Traceback (most recent call last):
18   File "<stdin>", line 1, in <module>
19 AttributeError: ‘collections.defaultdict‘ object has no attribute ‘append‘
20 >>> dic1[‘k2‘].append(22)  # 可以对默认字典中的列表元素做append操作
21 >>> dic1
22 defaultdict(<type ‘list‘>, {‘k2‘: [22]})
23 >>> 


可命名的元组

使用步骤:

1,创建类

2,使用类创建对象

3,使用对象


1 >>> Mytuple = collections.namedtuple(‘Mytuple‘,[‘x‘,‘y‘])
2 >>>
3 >>> n = Mytuple(x=1,y=2)
4 >>> n.x
5 1
6 >>> n.y
7 2
8 >>>

help(Mytuple)

  1  Help on class Mytuple in module __main__:
  2
  3  class Mytuple(__builtin__.tuple)
  4   |  Mytuple(x, y)
  5   |
  6   |  Method resolution order:
  7   |      Mytuple
  8   |      __builtin__.tuple
  9   |      __builtin__.object
 10   |
 11   |  Methods defined here:
 12   |
 13   |  __getnewargs__(self)
 14   |      Return self as a plain tuple.  Used by copy and pickle.
 15   |
 16   |  __getstate__(self)
 17   |      Exclude the OrderedDict from pickling
 18   |
 19   |  __repr__(self)
 20   |      Return a nicely formatted representation string
 21   |
 22   |  _asdict(self)
 23   |      Return a new OrderedDict which maps field names to their values
 24   |
 25   |  _replace(_self, **kwds)
 26   |      Return a new Mytuple object replacing specified fields with new values
 27   |
 28   |  ----------------------------------------------------------------------
 29   |  Class methods defined here:
 30   |
 31   |  _make(cls, iterable, new=<built-in method __new__ of type object>, len=<built-in function len>) from __builtin__.type
 32   |      Make a new Mytuple object from a sequence or iterable
 33   |
 34   |  ----------------------------------------------------------------------
 35   |  Static methods defined here:
 36   |
 37   |  __new__(_cls, x, y)
 38   |      Create new instance of Mytuple(x, y)
 39   |
 40   |  ----------------------------------------------------------------------
 41   |  Data descriptors defined here:
 42   |
 43   |  __dict__
 44   |      Return a new OrderedDict which maps field names to their values
 45   |
 46   |  x
 47   |      Alias for field number 0
 48   |
 49   |  y
 50   |      Alias for field number 1
 51   |
 52   |  ----------------------------------------------------------------------
 53   |  Data and other attributes defined here:
 54   |
 55   |  _fields = (‘x‘, ‘y‘)
 56   |
 57   |  ----------------------------------------------------------------------
 58   |  Methods inherited from __builtin__.tuple:
 59   |
 60   |  __add__(...)
 61   |      x.__add__(y) <==> x+y
 62   |
 63   |  __contains__(...)
 64   |      x.__contains__(y) <==> y in x
 65   |
 66   |  __eq__(...)
 67   |      x.__eq__(y) <==> x==y
 68   |
 69   |  __ge__(...)
 70   |      x.__ge__(y) <==> x>=y
 71   |
 72   |  __getattribute__(...)
 73   |      x.__getattribute__(‘name‘) <==> x.name
 74   |
 75   |  __getitem__(...)
 76   |      x.__getitem__(y) <==> x[y]
 77   |
 78   |  __getslice__(...)
 79   |      x.__getslice__(i, j) <==> x[i:j]
 80   |
 81   |      Use of negative indices is not supported.
 82   |
 83   |  __gt__(...)
 84   |      x.__gt__(y) <==> x>y
 85   |
 86   |  __hash__(...)
 87   |      x.__hash__() <==> hash(x)
 88   |
 89   |  __iter__(...)
 90   |      x.__iter__() <==> iter(x)
 91   |
 92   |  __le__(...)
 93   |      x.__le__(y) <==> x<=y
 94   |
 95   |  __len__(...)
 96   |      x.__len__() <==> len(x)
 97   |
 98   |  __lt__(...)
 99   |      x.__lt__(y) <==> x<y
100   |
101   |  __mul__(...)
102   |      x.__mul__(n) <==> x*n
103   |
104   |  __ne__(...)
105   |      x.__ne__(y) <==> x!=y
106   |
107   |  __rmul__(...)
108   |      x.__rmul__(n) <==> n*x
109   |
110   |  __sizeof__(...)
111   |      T.__sizeof__() -- size of T in memory, in bytes
112   |
113   |  count(...)
114   |      T.count(value) -> integer -- return number of occurrences of value
115   |
116   |  index(...)
117   |      T.index(value, [start, [stop]]) -> integer -- return first index of value.
118   |      Raises ValueError if the value is not present.
119  (END)


双向队列:deque

     双向队列可以在队列的两端进行读取和插入

     是线程安全的


 1 >>> import collections
 2 >>> q = collections.deque()
 3 >>> q.append(1)
 4 >>> q.append(2)
 5 >>> q.append(3)
 6 >>> q.append(4)
 7 >>>
 8 >>> q
 9 deque([1, 2, 3, 4])
10 >>> q.pop()
11 4
12 >>> q
13 deque([1, 2, 3])
14 >>> q.popleft()    # 此处要注意,是popleft而非leftpop
15 1
16 >>> q
17 deque([2, 3])
18 >>>
19 >>> q.appendleft(5)
20 >>> q
21 deque([5, 2, 3])
22 >>>


单向队列(不是collections系列的模块,属于Queue系列):

也是一个线程安全的数据结构

 1 >>> import Queue
 2 >>>
 3 >>> q = Queue.Queue(10)
 4 >>>
 5 >>> q.put(1)
 6 >>> q.put(2)
 7 >>> q.put(3)
 8 >>> q
 9 <Queue.Queue instance at 0x7f3975f505a8>
10 # 此处返回的是这个对象实例的内存地址
11 # 之所以没有返回队列中所有的元素是因为
12 # 在Queue的类的定义中没有实现__str__的方法。
13 >>> q.get()
14 1
15 >>> q.get()
16 2
17 >>> q.get()
18 3
19 >>> q.get() # 此时队列里已经没有元素了,再get则会hang住。
20
21
22
23
24 ^C^C

注意:在get时,如果过队列里面没有数据的时候,线程会hang住。



迭代器

① 创建一个类

② 类中需要实现next方法,用来判断是否有下一条数据。


 1 >>> dir(list)
 2 [‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__delitem__‘, ‘__delslice__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getslice__‘, ‘__gt__‘, ‘__hash__‘, ‘__iadd__‘, ‘__imul__‘, ‘__init__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__reversed__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__setitem__‘, ‘__setslice__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘append‘, ‘count‘, ‘extend‘, ‘index‘, ‘insert‘, ‘pop‘, ‘remove‘, ‘reverse‘, ‘sort‘]
 3 >>>
 4 >>> help(list.__iter__)
 5
 6
 7 Help on wrapper_descriptor:
 8
 9 __iter__(...)
10     x.__iter__() <==> iter(x)
11 (END)

打印列表的2种方法:

 1 # 方法1
 2 >>> li = [11,22,33,44,55,66]
 3 >>> for i in li:
 4 ...     print i
 5 ...
 6 11
 7 22
 8 33
 9 44
10 55
11 66
12 >>>
13 # 方法2
14 >>> li = [11,22,33,44,55,66]
15 >>> for i in range(len(li)):
16 ...     print li[i]
17 ...
18 11
19 22
20 33
21 44
22 55
23 66
24 >>>

生成器:

例子:

1 >>>
2 >>> range(10)
3 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4 >>>
5 >>> xrange(10)
6 xrange(10)
7 >>> 

辅助理解的类比:

数据库的连接池的概念,连接池就可以使用生成器来做。

生成器的思想:先返回对象,不会直接在内存中创建。

 

上例中的range会直接在内存中创建对象,xrange不会立刻创建。



冒泡排序算法:

 1 # 基于range的冒泡排序算法
 2 li = [13, 22, 6, 99, 11]
 3
 4 for m in range(len(li)-1):
 5
 6     for n in range(m+1, len(li)):
 7         if li[m]> li[n]:
 8             temp = li[n]
 9             li[n] = li[m]
10             li[m] = temp
11
12 print li


函数(代码块)

按功能划分的代码块

函数的分类:

内置函数

自定义函数

导入函数



内置函数



help()

dir()

vars() # 当前模块的所有变量

__file__

__doc__

文件顶部用三引号做的注释就是程序的__doc__

__name__

被执行的脚本文件的__name__的值为__main__

type() # 类型

id() #显示内存地址 

is # 比较内存地址



在vars里面inportvar01

var01里面的代码会直接执行,因此在后面写代码的时候都要写成函数,不允许有可以被直接执行的代码。


cmp(2,3)

divmod(10,3) # 商和余数,用户页面分页

max()

min()

sum()

power(2,11)


len()

all() # 接受一个序列,判断,所有值都是真,返回真,否则为假。

# eg:可以用来判断用户输入值的判定

any() #接受一个序列,判断,所有值都是假,返回假;只要有一个值为真,返回真。


all,any的简单样例:

 1 >>> li = [‘stephen‘,‘‘,25]
 2 >>> all(li)
 3 False
 4 >>> any(li)
 5 True
 6 >>>
 7 >>> li = [‘stephen‘,‘password‘,25]
 8 >>> all(li)
 9 True
10 >>> any(li)
11 True
12 >>>
13 >>> li = [‘‘]
14 >>> all(li)
15 False
16 >>> any(li)
17 False
18 >>>
19 >>> 

ASCII码数字对照表

ord # 字符到数字

chr # 数字到字符


进制转换

hex()

oct()

bin()


枚举类型:enumbrare


 1 >>> li =  [11,22,33,44,55,66]
 2 >>> for k,v in enumerate(li):
 3 ...     print k,v
 4 ...
 5 0 11
 6 1 22
 7 2 33
 8 3 44
 9 4 55
10 5 66
11 >>>
12 >>> for k,v in enumerate(li,1):
13 ...     print k,v
14 ...
15 1 11
16 2 22
17 3 33
18 4 44
19 5 55
20 6 66
21 >>>
22 >>> 

map等内置函数。。。


函数

第一个函数(简易报警程序):

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = ‘Stephen‘
 4
 5 def email(arg):
 6 #print arg
 7
 8 if __name__ == ‘__main__‘:
 9 cpu = 99
10 ram = 50
11 disk = 95
12
13 for i in range(1):
14     if cpu > 90:
15         alert = ‘cpu is ERROR‘
16         email(alert)
17     if ram > 90:
18         alert = ‘memory is ERROR‘
19         email(alert)
20     if disk > 90:
21         alert = ‘disk is ERROR‘
22         email(alert)

程序运行结果:

C:\Python27\python.exe G:/python/day03/def_function.py
cpu is ERROR
disk is ERROR

Process finished with exit code 0

修改为smtp的方式


 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 __author__ = ‘Stephen‘
 4
 5 import smtplib
 6 from email.mime.text import MIMEText
 7 from email.utils import formataddr
 8
 9 def email(arg): # 此处的arg为形式参数,简称形参。不赋值的时候没有实际意义。
10     msg = MIMEText(‘邮件内容‘, ‘plain‘, ‘utf-8‘)
11     msg[‘From‘] = formataddr(["Stephen",‘xxx@126.com‘])
12     msg[‘To‘] = formataddr(["thatsit",‘xxx@qq.com‘])
13     msg[‘Subject‘] = "监控报警邮件"
14
15     server = smtplib.SMTP("smtp.126.com", 25)
16     server.login("mail-address@126.com", "PASSWORD")
17     server.sendmail(‘xxx@126.com‘, [‘xxx@qq.com‘,], msg.as_string())
18     server.quit()
19
20
21 if __name__ == ‘__main__‘:
22     cpu = 99
23     ram = 50
24     disk = 95
25
26     for i  in  range(10):
27         if cpu > 90:
28             alert = ‘cpu is ERROR 第%d次‘ %i
29             email(alert) # 此处的alert在赋值之后就是实际参数。
30         if ram > 90:
31             alert = ‘memory is ERROR 第%d次‘ %i
32             email(alert)
33         if disk > 90:
34             alert = ‘disk is ERROR 第%d次‘ %i
35             email(alert)

函数小结:

     1,def关键字定义函数

     2,函数名,日后调用函数使用

     3,函数声明,不自动执行;调用后才执行

     4,函数的参数

          ① 普通参数

② 默认参数

③ 动态参数

     5,函数的返回值

          ① 如果一个函数不定义明确的返回值(return),返回值为None。

② 返回值可以赋值给某个变量


动态参数详解:     

# 参数可以有N个,传入指定个数的参数。

# 默认参数可以有多个,但是需要放到参数列表的最后。

# def func(*args)

# 内部自动构造元组

# 传序列时,可以使用*号防止内部构造元组


动态参数2:

1 def func(**kwargs):
2      print kwargs
3
4 func (k1=123,k2=‘sss‘)
5
6 dic = {k1:123,k2:234}
7 func (**dic)


文件操作:

文件操作(分为两个步骤:打开文件,操作文件)
      文件打开方式:(#涉及到python升级的原因,推荐使用open的方式打开文件)
          ① obj = file(‘文件路径‘,‘打开模式‘)
          ② obj = open(‘文件路径‘,‘打开模式‘)

1 r,只读
2 w,清空原文件写
3 a,可读,可写,只能以追加的方式写
4
5 r+,可读可写
6 w+ <==> w
7 a+ <==> a

文件指针操作样例

1 obj = open(‘log.txt‘,‘r‘) # 打开文件
2 obj.seek(5)       # 指定文件的指针
3 print obj.tell()  # 显示文件指针
4 obj.read()        # 将文件全部加载到内存,此时的文件指针已经到了文件的尾部
5 print obj.tell()  # 显示文件指针

执行结果:

C:\Python27\python.exe G:/python/day03/func.py
5
24

Process finished with exit code 0

文件其他操作

 1 truncate() # 根据当前指针的位置截断数据,截断位置也可以使用参数指定。
 2            # eg:truncate(5)
 3
 4 b   # 二进制,在linux没有什么卵用,在跨平台的时候要用。
 5 rU  # U参数只能跟r结合。写法有rU和r+U两种。
 6     # 用来处理不同平台的换行符的问题:处理不同平台的换行符的问题:(\n,\r,\r\n)。
 7
 8
 9 托管资源:手动进行释放,在python中才有,用于同时打开同一个文件。
10 非托管资源:
11
12 closed() #关闭文件
13 flush()  # 会把应用缓存写到系统缓存中,但是不一定会直接写到磁盘,依赖于系统机制
14
15 open()         #打开文件:
16 next()         # 取下一行,不存在会报错。
17 write()        # 写文件
18 writelines()   # 参数可以是一个列表
19 xreadlines()   # 逐行读取文件
20 for line in f: # 用来替换for line in f.xreadlines()

with关键字,用来做上下文管理。并且with在python2.7之后支持同时打开多个配置文件。

1 obj = open(‘log‘,‘r‘)
2 with open(‘log‘,‘r‘) as obj:
时间: 2024-10-14 08:50:20

My way to Python - Day03的相关文章

【转】Python 内置函数 locals() 和globals()

Python 内置函数 locals() 和globals() 转自: https://blog.csdn.net/sxingming/article/details/52061630 1>这两个函数主要提供,基于字典的访问局部变量和全局变量的方式. python 使用叫做名字空间的东西来记录变量的轨迹.名字空间是一个字典 ,它的键就是字符串形式的变量名字,它的值就是变量的实际值. 名字空间可以像 Python 的 dictionary 一样进行访问. 在一个 Python 程序中的任何一个地方

Python 变量类型day03

变量赋值 Python中的变量不需要声明,变量的赋值操作既是变量声明和定义的过程. 每个变量在内存中创建,都包括变量的标识,名称和数据这些信息. 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 等号(=)用来给变量赋值. 等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值.例如: #!/usr/bin/python counter = 100 # An integer assignment miles = 1000.0 # A floating point na

Python基础-day03

写在前面 上课第三天,打卡:  不要让干净的灵魂染上尘埃,永远年轻.永远热泪盈眶 一.再谈编码 - 文件的概念 '文件' 是一个抽象的概念,是操作系统提供的外部存储设备的抽象,对应底层的硬盘:它是程序和数据的最终存放地点. 操作系统把硬盘存储的具体操作封装起来,提供一些简单易用的API,让用户不用去关心底层复杂的实现方法: 即:让用户的数据存放变得容易.方便和可靠. 另外,磁盘没有 '修改' 一说,全部都是覆盖: - Unicode 和 utf-8 > 备注:这段精辟的解释来自于 林海峰老师的博

Python学习day03

一.集合 与列表和元组不同,集合是无序的,也无法通过数字进行索引.此外,集合中的元素不能重复 创建集合: 使用set函数 集合操作: s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) t.add('

python学习点滴记录-Day03

函数基础 一. 使用函数带来的好处 #使代码组织结构清晰#减少代码冗余#可以统一管理且降低维护难度可以把函数当作日常生活中的工具,具备某种功能的物件,直接拿来使用即可. 二.函数的分类 内置函数:python解释器内置了大量函数方便开发者直接使用 自定义函数:根据自身需求自己编写的函数 三.函数的使用 定义函数 函数的定义与变量的定义类似,需要提前定义再调用 定义函数时只检测语法,不执行代码 def 函数名(arg1,arg2,arg3): '''注释''' 函数体 return 返回值 调用函

Python开发Day03(练习解答)

练习一. '''普通参数分为形参.实参,有多少形参,就必须要给函数多少个实参. 指定参数为,假如有name和age两个形参,在给函数参数的时候指定name='****',age='**' 默认参数为必须放在参数的尾部,列如一个name形参,一个age形参,我们可以将name形参放在前面,这样用户必须给函数一个名字,age放在后面默认等于18.(name,age=18) 动态参数:在形参前面加一个*号,可以传入多个参数,在函数内类型会变为元组. 在形为参数前面加两个*号,传入的值为字典类型,相当于

python学习笔记-day03 (函数和文件操作)

函数(代码块,按功能划分(也可按其他方式划分)) 内置函数第三方函数自定义函数 内置函数:help()dir()type()reload()id() vars()  # 获取脚本中的变量,当前模块的所有变量    {'__name__': '__main__',  #被执行的脚本,__name__ 的值为__main__    '__builtins__': <module '__builtin__' (built-in)>,     '__file__': '/PYthon/test/tes

Python学习笔记-Day03 -第三部分(迭代器和生成简介)

迭代器 迭代器是一个容器对象,有两个基本方法 netxt()   #返回容器的下一个元素 __iter__  #返回迭代器自身 迭代器自2.2版本 被加入python,它为类序列对象提供了一个类序列的接口,从根本上说,迭代器就是有一个next()方法的对象,而不是通过索引来记数,当你 或者一个循环机制(比如for)需要下一个项时,调用迭代器的next() 方法 就可以获取到它,条目全部取出后,或引发一个StopIteration异常,你并看不到该异常,python内部会处理该异常,目的只是为了告

python之路:Day03 --- Python基础3 &gt;&gt;函数

本节内容 1.函数基本语法及特性 2.参数 3.局部变量与全局变量 4.返回值 嵌套函数 5.递归 6.匿名函数 7.高阶函数 8.内置函数 一.函数基本语法及特性 区别 面向过程编程:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处. 函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可. 面向对象编程:对函数进行分类和封装,让开发"更快更好更强..." 特性 1.减少重复