重新学习python系列(四)? WTF?

多进程:

fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),

然后,分别在父进程和子进程内返回
getppid()得到父进程的ID
getpid() 得到当前进程的ID

# multiprocessing.py
import os

print ‘Process (%s) start...‘ % os.getpid()
pid = os.fork()
if pid==0:
    print ‘I am child process (%s) and my parent is %s.‘ % (os.getpid(), os.getppid())
else:
    print ‘I (%s) just created a child process (%s).‘ % (os.getpid(), pid)

Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.

进程之间的通信:

from multiprocessing import Process, Queue
import os, time, random

# 写数据进程执行的代码:
def write(q):
    for value in [‘A‘, ‘B‘, ‘C‘]:
        print ‘Put %s to queue...‘ % value
        q.put(value)
        time.sleep(random.random())

# 读数据进程执行的代码:
def read(q):
    while True:
        value = q.get(True)
        print ‘Get %s from queue.‘ % value

if __name__==‘__main__‘:
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()
    # 启动子进程pr,读取:
    pr.start()
    # 等待pw结束:
    pw.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    pr.terminate()

多线程:

Python的标准库提供了两个模块:threadthreadingthread是低级模块,threading是高级模块,对thread进行了封装。

绝大多数情况下,我们只需要使用threading这个高级模块。

启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行:

#coding=utf-8
import time, threading

# 新线程执行的代码:
def loop():
    print ‘thread %s is running...‘ % threading.current_thread().name
    n = 0
    while n < 5:
        n = n + 1
        print ‘thread %s >>> %s‘ % (threading.current_thread().name, n)
        time.sleep(1)
    print ‘thread %s ended.‘ % threading.current_thread().name

print ‘thread %s is running...‘ % threading.current_thread().name
t = threading.Thread(target=loop, name=‘LoopThread‘)
t.start()
t.join()
print ‘thread %s ended.‘ % threading.current_thread().name

。。。。。。。

collections模块提供了一些有用的集合类,可以根据需要选用。

defaultdict

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

#coding=utf-8
from collections import defaultdict
dd = defaultdict(lambda: ‘N/A‘)
dd[‘a‘] = 123
print dd[‘a‘]
print dd[‘b‘]

OrderedDict

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

如果要保持Key的顺序,可以用OrderedDict

OrderedDict可以实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最早添加的Key:

。。。。。。。。。。。。。。

base64

>>> base64.b64encode(‘i\xb7\x1d\xfb\xef\xff‘)
‘abcd++//‘
>>> base64.urlsafe_b64encode(‘i\xb7\x1d\xfb\xef\xff‘)
‘abcd--__‘
>>> base64.urlsafe_b64decode(‘abcd--__‘)
‘i\xb7\x1d\xfb\xef\xff‘

python计数器Count

# -*- coding:utf-8 -*-
"""
  python计数器Counter
  需导入模块collections
"""
import collections

# 统计各个字符出现的次数,以字典形式返回
obj = collections.Counter(‘adfsdfsdfswrwerwegfhgfhgh‘)
print obj
# elements => 原生的传入的值(‘adfsdfsdfswrwerwegfhgfhgh‘)
for v in obj.elements():
    print v

# 按参数给定的个数返回
print obj.most_common(4)

# 执行结果显示 Counter({‘f‘: 5, ‘d‘: 3, ‘g‘: 3, ‘h‘: 3, ‘s‘: 3, ‘w‘: 3, ‘e‘: 2, ‘r‘: 2, ‘a‘: 1}) [(‘f‘, 5), (‘d‘, 3), (‘g‘, 3), (‘h‘, 3)]

请写一个能处理 去掉=的base64解码函数:

import base64
text = ‘YWJjZA‘
if not len(text)%4==0:
    print base64.b64decode(text+"="*(len(text)%4))

structpack函数把任意数据类型变成字符串:

>>> import struct
>>> struct.pack(‘>I‘, 10240099)
‘\x00\[email protected]‘

unpackstr变成相应的数据类型:

>>> struct.unpack(‘>IH‘, ‘\xf0\xf0\xf0\xf0\x80\x80‘)
(4042322160, 32896)
时间: 2024-10-13 02:43:48

重新学习python系列(四)? WTF?的相关文章

重新学习python系列(一)? WTF?

重新学习python:两年前学了点python之后就一直没做做过啥项目, 基本上全忘光了,复习一下搞点事情 or |and & ord() ascii转16进制 chr()  16进制转ascii >>> u'ABC'.encode('utf-8') 'ABC' >>> u'中文'.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87' >>> 'abc'.decode('utf-8') u'abc' >&g

重新学习python系列(二)? WTF?

判断class的类型,可以使用isinstance()函数. isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上. >>> a = Animal() >>> d = Dog() >>> h = Husky()>>> isinstance(h, Husky) True>>> isinstance(h, Dog) True 能用type()判断的基本类型也可以用isinstance()判

重新学习python系列(三)? WTF?

读取文件: try: f = open('/path/to/file', 'r') print(f.read()) finally: if f: f.close() ------------------------------------- with open('/path/to/file', 'r') as f: print(f.read()) ------------------------------------- 调用readline()可以每次读取一行内容,调用readlines()一

小白学习Spark系列四:rdd踩坑总结

初次尝试用 Spark+scala 完成项目的重构,由于两者之前都没接触过,所以边学边用的过程大多艰难.首先面临的是如何快速上手,然后是代码调优.性能调优.本章主要记录自己在项目中遇到的问题以及解决方式,下篇会尝试调优方法.末尾会分享自己的学习资料,也供大多菜鸟第一次使用作为参考.由于自己项目中大量使用spark sql,所以下面的经验大多是和spark sql有关.同样下面也列出作为菜鸟在学习过程中的困惑以及踩的坑,还请大牛勿笑 ~_~ 如果有更好的方式解决,欢迎留言,一起学习. 1.常用场景

2017寒假零基础学习Python系列之函数之 函数之定义可变参数

若想让函数接受任意个参数,就可以定义一个可变的参数: def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1,2,5,6) 原理是Python解释器把传入的一组参数封装在一个tuple传递给可变参数,因此在函数内部,直接把变量args看成一个tuple就好了,目的是简化调用 小习题:假设我们要计算任意个数的平均值,就可以定义一个可变参数: def average(*args): ... 这样,在调用的时候,可以这样写

2017寒假零基础学习Python系列之函数之 返回多个值

Python也和C语言一样有自己的标准库,不过在Python中叫做模块(module),这个和C语言中的头文件以及Java中的包类似,其中math就是其中之一,math模块中提供了sin()和cos()函数 引用Python中模块(以引用math为例)的格式为:import math 以一个计算游戏中坐标的例子来说吧: import math def move(x,y,step,angle): nx = x + step * math.cos(angle) ny = y - step * mat

【Python】Java程序员学习Python(四)— 内置方法和内置变量

<假如爱有天意> 当天边那颗星出现,你可知我又开始想念,有多少爱恋只能遥遥相望,就像月光洒向海面,年少的我们曾以为,相爱的人就能到永远,当我们相信情到深处在一起,听不见风中的叹息,谁知道爱是什么,短暂的相遇却念念不忘,用尽一生的时间,竟学不会遗忘,如今我们已天各一方,生活的像周围人一样,眼前人给我最信任的依赖,但愿你被温柔对待,多少恍惚的时候,仿佛看见你在人海川流,隐约中你已浮现,一转眼又不见,短暂的相遇却念念不忘,多少恍惚的时候,仿佛看见你在人海川流,隐约中你已浮现,一转眼又不见,当天边那颗

学习python第四天——列表方法

1.append() 列表append()昨天说过用于在列表尾部添加元素 2.clear() 用于列表元素清除,释放内存 3.copy() 字面意思复制,拷贝分为浅拷贝和深拷贝,copy()方法属于列表深拷贝. 深拷贝和浅拷贝抄自其他网页: 浅拷贝 1.对于 不可 变类型 Number String Tuple,浅复制仅仅是地址指向,不会开辟新空间. 2.对于 可 变类型 List.Dictionary.Set,浅复制会开辟新的空间地址(仅仅是最顶层开辟了新的空间,里层的元素地址还是一样的),进

2017寒假零基础学习Python系列之函数之 递归函数

什么是递归函数? 在函数内部,也可以继续调用其他函数,如果一个函数在内部调用本身,这个函数为递归函数举一个求n的阶乘的例子: def fact(n): if n == 1: return 1; else: return n * fact(n-1) print fact(5) >>>120 以上就是一个递归函数 这个函数运行的过程如下: ===> fact(5) ===> 5 * fact(4) ===> 5 * (4 * fact(3)) ===> 5 * (4