美文网首页
python+AI第十一课

python+AI第十一课

作者: M_小七 | 来源:发表于2019-11-25 11:29 被阅读0次
随机数模块

随机数模块常用方法
random.randint(a, b),返回a和b之间的随机整数

import random
a = random.randint(0, 10)
b = random.randint(0, 10)
c = random.randint(0, 10)
print(a, b, c)
# 3 5 10

random.random(),返回0到1之间随机数(不包括1)

import random
a = random.random()

b = random.random()

c = random.random()
print(a, b, c)
# 0.6757757532603484 
# 0.1256660764957097 
# 0.3954464140289171

random.choice(seq),在不为空的序列中随机选择一个元素

s = 'helloworld'
print(random.choice(s))
# l

random.sample(population, k):在一个序列或者集合中选择k个随机元素(),返回由K个元素组成新的列表(k的值小于population的长度)

print(random.sample('12345', 2))
print(random.sample('12345', 5))
# ['4', '2']
# ['4', '3', '1', '5', '2']

random.uniform(a, b):产生一个指定范围内的随机浮点数 若a < b,随机数n范围:a <= n <= b; 若a > b,随机数n范围:a<= n <= b

print(random.uniform(1,10))
# 1.9304756617571137
print(random.uniform(10, 1))
# 2.872422460231057

random.randrange(start, stop=None, step=1, _int=) :在rang(start, stop,step)中选择一个随机数

print(random.randrange(1,100,1))
# 84 [1,100)之间随机整数
print(random.randrange(1,100,2))
# 91 [1, 100)之间随机奇数

random.shuffle(x, random=None):将列表顺序打乱

l = ['C', 'C++', 'Java', 'C#', 'Python']
random.shuffle(l)
print(l)
# ['C', 'Python', 'Java', 'C++', 'C#']
Collections模块

该模块实现了专门的容器数据类型,为Python的通用内置容器提供了替代方案。 以下几种类型用的很多:

  • defaultdict (dict子类调用工厂函数来提供缺失值)
    查不到key值时不会报错的dict
from collections import defaultdict
person = defaultdict(lambda : 'Key Not found') # 初始默认所有key对应的value均为‘Key Not Found’

person['name'] = 'xiaobai'
person['age'] = 18

print ("The value of key  'name' is : ",person['name'])
print ("The value of key  'adress' is : ",person['city'])

#The value of key  'name' is :  xiaobai The value of key  'adress' is :  Key Not found

还可以利用defaultdict创建时,传递参数为所有key默认value值这一特性,实现一些其他的功能

from collections import defaultdict
d = defaultdict(list)
d['person'].append("xiaobai")
d['city'].append("paris")
d['person'].append("student")

for i in d.items():
    print(i)

# ('person', ['xiaobai', 'student'])
     ('city', ['paris'])
  • counter (用于计算可哈希对象的dict子类)
    Counter是dict的子类。因此,它是一个无序集合,其中元素及其各自的计数存储为字典。就是一个计数器,一个字典,key就是出现的元素,value就是该元素出现的次数
from collections import Counter
count_list = Counter(['B','B','A','B','C','A','B','B','A','C'])  #计数list
print (count_list)
count_tuple = Counter((2,2,2,3,1,3,1,1,1))  #计数tuple
print(count_tuple)
# Counter({'B': 5, 'A': 3, 'C': 2})
# Counter({1: 4, 2: 3, 3: 2})
  • deque (类似于列表的容器,可以从两端操作)
    在需要在容器两端的更快的添加和移除元素的情况下,可以使用deque
from collections import deque
d = deque()
d.append(1)
d.append(2)
d.append(3)
print(len(d))
print(d[0])
print(d[-1])
# 3
# 1
# 3
  • namedtuple (用于创建具有命名字段的tuple子类的工厂函数)
    命名元组。大家一看名字就会和tuple元组有关,没错,它是元组的强化版。namedtuple可以将元组转换为方便的容器。使用namedtuple,不必使用整数索引来访问元组的成员。
from collections import namedtuple

Person = namedtuple('Person', 'name age city')        # 类似于定义class
xiaobai = Person(name="xiaobai", age=18, city="paris") # 类似于新建对象
print(xiaobai)

# Person(name='xiaobai', age=18, city='paris')
  • OrderedDict (记录输入顺序的dict)基本不再使用
pickle模块

python对象的序列化与反序列化
特点
1.只能在python中使用,只支持python的基本数据类型。
2.可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等)
一、内存中操作: dumps方法将对象转成字节(序列化) loads方法将字节还原为对象(反序列化)

import pickle
#dumps
li = [11,22,33]
r = pickle.dumps(li)
print(r)
#loads
result = pickle.loads(r)
print(result)

二、文件中操作:

#dump:
import pickle
li = [11,22,33]
pickle.dump(li,open('db','wb'))
#load
ret = pickle.load(open('db','rb'))
print(ret)

三、练习:

pickle的序列化: 格式:pickle.dumps(序列化对象)
import pickle
test = r'test.txt'

反序列化代码中也要定义相同的函数名称,函数体没限制

def sayhi(name):
    print("hello",name)

info = {
    '':'',
    'age':32,
    'func':sayhi
}

print(pickle.dumps(info))

with open(test,'wb') as f:
    f.write( pickle.dumps(info) )

pickle反序列化: 格式:pickle.loads(读取文件逐行记录)

import pickle

test = r'test.txt'

#需要定义序列化代码中同样的函数名,函数体没限制
def sayhi(name):
    print("hello",name)
    print("hello2",name)

with open(test,'rb') as f:
    data = pickle.loads(f.read())
    print('data>>>',data)
print(data['func']("Alex"))
data>>> {'': '', 'age': 32, 'func': <function sayhi at 0x000000000231C1E0>}
hello Alex
hello2 Alex
None

注意: 1.print(data'func')
调用了pickle的反序列化变量data。
2.需要在序列化和反序列化定义相同的函数名称,但内容可以不一样。否则报错如下:

AttributeError: Can't get attribute 'sayhi' on <module '__main__'
写入文件并序列化

格式:pickle.dump(序列对象变量,文件名)

import pickle
test = r'test.txt'
#反序列化代码中也要定义相同的函数名称,函数体没限制
def sayhi(name):
    print("hello",name)
info = {
    '':'',
    'age':32,
    'func':sayhi
}
print(pickle.dumps(info))
with open(test,'wb') as f:
    #f.write( pickle.dumps(info) )
    pickle.dump(info,f)  #跟上面的f.write( pickle.dumps(info) )语意完全一样。

从文件中读取,并反序列化: 格式:pickle.load(文件名)

import pickle
test = r'test.txt'
#需要定义序列化代码中同样的函数名,函数体没限制
def sayhi(name):
    print("hello",name)
    print("hello2",name)
with open(test,'rb') as f:
    # data = pickle.loads(f.read())
    data = pickle.load(f)  #跟上面的data = pickle.loads(f.read())语意完全一样。
    print('data>>>',data)
print(data['func']("Alex"))

相关文章

网友评论

      本文标题:python+AI第十一课

      本文链接:https://www.haomeiwen.com/subject/gbdzictx.html