- Python3 多线程

多线程类似于同时执行多个不同程序,多线程运行有如下优点:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。

  • 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。

  • 程序的运行速度可能加快。

  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
    每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。

指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。

  • 线程可以被抢占(中断)。

  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) – 这就是线程的退让。
    线程可以分为:

  • 内核线程:由操作系统内核创建和撤销。

  • 用户线程:不需要内核支持而在用户程序中实现的线程。
    Python3 线程中常用的两个模块为:

  • _thread

  • threading(推荐使用)
    thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用”thread” 模块。为了兼容性,Python3 将 thread 重命名为 “_thread”。

- 开始学习Python线程

Python中使用线程有两种方式:函数或者用类来包装线程对象。

函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下:

_thread.start_new_thread ( function, args[, kwargs] )

参数说明:

  • function - 线程函数。

  • args - 传递给线程函数的参数,他必须是个tuple类型。

  • kwargs - 可选参数。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python3

import _thread
import time

# 为线程定义一个函数
def print_time( threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print ("%s: %s" % ( threadName, time.ctime(time.time()) ))

# 创建两个线程
try:
_thread.start_new_thread( print_time, ("Thread-1", 2, ) )
_thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
print ("Error: 无法启动线程")

while 1:
pass

执行以上程序输出结果如下:

Thread-1: Wed Jan  5 17:38:08 2022
Thread-2: Wed Jan  5 17:38:10 2022
Thread-1: Wed Jan  5 17:38:10 2022
Thread-1: Wed Jan  5 17:38:12 2022
Thread-2: Wed Jan  5 17:38:14 2022
Thread-1: Wed Jan  5 17:38:14 2022
Thread-1: Wed Jan  5 17:38:16 2022
Thread-2: Wed Jan  5 17:38:18 2022
Thread-2: Wed Jan  5 17:38:22 2022
Thread-2: Wed Jan  5 17:38:26 2022

执行以上程后可以按下 ctrl-c 退出。

阅读全文 »

- Python3 正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。

re 模块使 Python 语言拥有全部的正则表达式功能。

compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。

re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

- re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

函数语法:

1
re.match(pattern, string, flags=0)

函数参数说明:

参数	  描述
pattern	匹配的正则表达式
string	要匹配的字符串。
flags	标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法	描述
group(num=0)	匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()	返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例

1
2
3
import re
print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配

以上实例运行输出结果为:

(0, 3)
None
阅读全文 »

- Python3 标准库概览

Python 标准库非常庞大,所提供的组件涉及范围十分广泛,使用标准库我们可以让您轻松地完成各种任务。

以下是一些 Python3 标准库中的模块:

  • os 模块:os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。

  • sys 模块:sys 模块提供了与 Python 解释器和系统相关的功能,例如解释器的版本和路径,以及与 stdin、stdout 和 stderr 相关的信息。

  • time 模块:time 模块提供了处理时间的函数,例如获取当前时间、格式化日期和时间、计时等。

  • datetime 模块:datetime 模块提供了更高级的日期和时间处理函数,例如处理时区、计算时间差、计算日期差等。

  • random 模块:random 模块提供了生成随机数的函数,例如生成随机整数、浮点数、序列等。

  • math 模块:math 模块提供了数学函数,例如三角函数、对数函数、指数函数、常数等。

  • re 模块:re 模块提供了正则表达式处理函数,可以用于文本搜索、替换、分割等。

  • json 模块:json 模块提供了 JSON 编码和解码函数,可以将 Python 对象转换为 JSON 格式,并从 JSON 格式中解析出 Python 对象。

  • urllib 模块:urllib 模块提供了访问网页和处理 URL 的功能,包括下载文件、发送 POST 请求、处理 cookies 等。

- 操作系统接口

os模块提供了不少与操作系统相关联的函数。

1
2
3
4
5
6
>>> import os
>>> os.getcwd() # 返回当前的工作目录
'C:\\Python34'
>>> os.chdir('/server/accesslogs') # 修改当前的工作目录
>>> os.system('mkdir today') # 执行系统命令 mkdir
0

建议使用 “import os” 风格而非 “from os import *”。这样可以保证随操作系统不同而有所变化的 os.open() 不会覆盖内置函数 open()。

在使用 os 这样的大型模块时内置的 dir() 和 help() 函数非常有用:

1
2
3
4
5
>>> import os
>>> dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>

针对日常的文件和目录管理任务,:mod:shutil 模块提供了一个易于使用的高级接口:

1
2
3
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
>>> shutil.move('/build/executables', 'installdir')
阅读全文 »

Python3 面向对象

Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。

如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。

接下来我们先来简单的了解下面向对象的一些基本特征。

- 面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
    方法:类中定义的函数。

  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

  • 局部变量:定义在方法中的变量,只作用于当前实例的类。

  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。

  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例图,Dog是一个Animal)。

  • 实例化:创建一个类的实例,类的具体对象。

  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
    和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。

Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

对象可以包含任意数量和类型的数据。

- 类定义

语法格式如下:

1
2
3
4
5
6
class ClassName:
<statement-1>
.
.
.
<statement-N>

类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。

阅读全文 »

夏天已经来了,天气一热,很多大鱼都会上钩,比如鲤鱼、草鱼、青鱼等。

想要钓到这些大鱼,有一种食物是必不可少的,那就是玉米。

玉米被称为“素饵之王”,在野外垂钓中,不管是新鲜的,还是发酵的,都是用来垂钓的。

但玉米在水里不会形成雾气,所以口感很淡,而且玉米的个头很大,而且野生的大鱼不多,用玉米钓鱼很难成功。

我们要理智的使用玉米,在垂钓中没有什么鱼饵是万能的,玉米好不好,关键就在于我们用的好不好。想要用玉米钓到大鱼,必须要有三样东西。

- 第一,看鱼的情况,看是不是要用玉米

以上所述,即使是“万能饵”,也不是每一种饵料都能得到鱼儿的喜爱,一种饵料好不好,要看鱼儿在用的时候情况。

我们要钓鱼的是一条警惕性很高的野生大鱼,在自然的环境下,他们会以草籽、水草、水果和谷物等天然的食物为食,所以他们更喜欢吃一些味道比较淡的天然食物。因此,用玉米来钓鱼并不是什么难事。

不过,野外的大鱼并不多,要想钓到大鱼,就得用诱饵,而玉米又不是雾化的,所以我们要用粉末状的诱饵。

所以,我们不能只用玉米粒来打窝,可以在窝料里加点玉米粉,也可以加点鱼饵。

- 第二,你买到的东西,未必就有你自己做的好

在许多情况下,我们都会使用到发酵的玉米,特别是在垂钓鲤鱼时,更是如此。这是因为,在夏季,锦鲤的食物会沉入水中,由于温度高,会迅速发酵,散发出酒香。鲤鱼习惯于食用发酵食品,所以我们用发酵过的玉米来钓鱼,很合他们的胃口。

很多垂钓爱好者都觉得,他们卖的是老玉米,味道更好。

但是实际上,我们自己煮出来的玉米往往比从外面买来的玉米更有效。由于自家煮制的玉米面,可以根据本地鱼肉的味道来调配,所用的玉米面和其他食材,都更新鲜。

许多人不想自己煮,一方面是因为加工过程繁琐,还不如买两包,动动手指头就能送到;二是他自己做的玉米面没有经过任何处理,在夏天的高温下,玉米面煮的太久就会坏掉,而在夏天煮的太久又太麻烦。

因此,有时间的垂钓朋友,我觉得自己可以用自己浸泡的玉米粒,与买来的玉米粒进行比较,看看鱼儿们更喜欢哪个。

如果水温超过25℃,应该果断地改用嫩玉米粒,因为在水温较暖和时,使用嫩玉米钓草鱼的效果非常好,如果水域中的草鱼较多,很容易钓到爆护。下面,我们就讲下夏季用嫩玉米钓草鱼的4个技巧。

- 第三,使用嫩玉米

一、使用新鲜的甜玉米或水果玉米

草鱼在高温天气时,非常喜欢吃嫩玉米,对嫩玉米中的甜玉米更为喜欢,甜玉米中的水果玉米则最好用。在用刀削玉米粒时,尽量削的深一些,让玉米粒成块地粘在一起,打窝诱鱼的效果更好。

二、玉米中要加白酒和糖

在夏季的炎热天气,嫩玉米粒很容易发酵变酸,垂钓效果就会大打折扣。为了防止嫩玉米粒发酵变质,可以在其中添加少量的白酒,保鲜效果很好。此外,还可以在嫩玉米中添加少量的糖,用来增加甜度,提高鱼饵的适口性,果葡糖浆或者蜂蜜都可以。

三、在玉米中添加诱食剂

每500克嫩玉米粒,可以添加1毫升的多巴盐和0.5毫升的鱼阿法,对草鱼的诱食效果非常好,能够增加窝子里草鱼的饥饿感和兴奋程度,让鱼口变得更好。

四、正确的打窝方法

草鱼是中下层鱼类,但不是底栖鱼类,不会老老实实底部窝子里吃食。想要把很多的草鱼诱到钓点里,钓鱼人需要持续地打窝,每分钟打一勺嫩玉米粒下去,每勺10~20粒嫩玉米,只要保持住较高的打窝频率,就能够钓到较多的草鱼。

图1(水库环境)

图2(22年夏天三一水库用嫩玉米连竿小草鱼)

- Python3 迭代器与生成器

- 迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

实例(Python 3.0+):

1
2
3
4
5
6
7
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

迭代器对象可以使用常规for语句进行遍历:

实例(Python 3.0+):

1
2
3
4
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end=" ")

执行以上程序,输出结果如下:

1 2 3 4

也可以使用 next() 函数:

阅读全文 »