Python 三十大实践、建议和技巧
所有参与投票的 CSDN 用户都参加抽奖活动
群内公布奖项,还有更多福利赠送
作者 | Erik-Jan van Baaren
译者 | 凯隐
编辑 | Jane
出品 | AI科技大本营(ID:rgznai100)
【导读】2020年,你又立了什么新的 Flag?新一年,我们先为大家准备 30 个非常优秀的 Python 实践技巧。希望这些诀窍能在实际工作中帮助大家,并且学到一些有用的知识。
1、使用 python 3
由于官方从2020年1月1日起就停止了对python2.7的更新支持,因此本教程的大部分例子都只能在python 3环境下运行。如果你仍然在使用2.7版本,请先升级到python 3。
2、检查并使用满足需求的最小python版本
你可以在代码中检查Python 版本,以确保你的代码使用者没有使用不兼容的版本运行脚本。使用以下代码进行简单的检查:
if not sys.version_info > (2, 7):# berate your user for running a 10 year# python version
elif not sys.version_info >= (3, 5):# Kindly tell your user (s)he needs to upgrade# because you're using 3.5 features
3、使用IPython
IPython 基本上是一个增强的shell,仅仅是为了自动补全功能,IPython也是值得使用的,但其实它还有更多作用,包括内建的Magic命令,这里列举了一些:
%cd:改变当前的工作目录
%edit:打开编辑器并在关闭编辑器后执行键入的代码
%env:显示当前的环境变量
%pip:install [pkgs] 在不离开交互式shell的情况下安装功能包
%time 和 %timeit:类似于python中的time模块,可以为代码运行计时
完整的命令列表参见:
https://ipython.readthedocs.io/en/stable/interactive/magics.html
IPython的另一个有用功能是可以使用之前任意一行代码的输出,代码的输入和输入实际上都是对象,例如可以通过 Out[3] 来使用第三次运行代码的输出对象。
安装IPython的指令是:
pip3 install ipython
4.列表解析式
列表解析式可以用来替换通过loop来填充列表的丑陋方法,其基本语法是:
[ expression for item in list if conditional ]
一个非常基础的例子,用于生成包含连续数字的列表:
mylist = [i for i in range(10)]
print(mylist)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
由于可以使用表达式,因此可以通过更复杂的数学方法来生成列表:
squares = [x**2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
甚至也可以调用外部函数:
def some_function(a):return (a + 5) / 2my_formula = [some_function(i) for i in range(10)]
print(my_formula)
# [2, 3, 3, 4, 4, 5, 5, 6, 6, 7]
最后,也可以用if作为生成条件来对列表进行过滤。在下面的例子中,只有偶数被保留:
filtered = [i for i in range(20) if i%2==0]
print(filtered)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
5、检查对象的内存占用情况
通过sys.getsizeof(object)命令可以查看任何对象的内存使用情况:
import sysmylist = range(0, 10000)
print(sys.getsizeof(mylist))
# 48
这是因为range函数返回的是一个类对象,这个类对象表现为一个列表。因此使用range函数比使用实际的包含一万个数字的列表要更加节省内存。
可以通过上面第四条中提到的列表解析式创建一个同样大小的实际列表:
import sysmyreallist = [x for x in range(0, 10000)]
print(sys.getsizeof(myreallist))
# 87632
实际内存占用87632字节,远高于通过range函数生成的对象。
6、返回多个值
Pyhon中的函数都可以返回多个变量,而不需要字典,列表或者类作为返回对象。方法如下:
def get_user(id):# fetch user from database# ....return name, birthdatename, birthdate = get_user(4)
对于有限数量的返回值,这是可以的。但是任何超过3个值的内容都应该放到一个(data)类中。
7、使用 data 类
从3.7版本开始,python提供了 data 类。与常规类或其他替代方法(如返回多个值或字典)相比,有以下几个优点:
数据类需要至少一定数量的代码
可以通过 __eq__ 方法来比较不同的data类对象
可以 __repr__ 通过很容易地打印一个数据类来进行调试
数据类需要类型提示,因此减少了 bug
一个data类的例子如下:
from dataclasses import dataclass@dataclass
class Card:rank: strsuit: strcard = Card("Q", "hearts")print(card == card)
# Trueprint(card.rank)
# 'Q'print(card)
Card(rank='Q', suit='hearts')
详细教程参见:
https://realpython.com/python-data-classes/
8、就地变量交换
一个简洁的技巧,可以节省几行代码:
a = 1
b = 2
a, b = b, a
print (a)
# 2
print (b)
# 1
9、字典合并(Python 3.5+)
从python 3.5开始,字典的合并变得更简单了:
dict1 = { 'a': 1, 'b': 2 }
dict2 = { 'b': 3, 'c': 4 }
merged = { **dict1, **dict2 }
print (merged)
# {'a': 1, 'b': 3, 'c': 4}
10、将字符串转化为标题格式
在标题格式中,非介词的首字母会大写。可以通过.title()方法实现:
mystring = "10 awesome python tricks"
print(mystring.title())
'10 Awesome Python Tricks'
11、将字符串分离并存储到列表中
可以按任意字符来分割字符串,并存储到列表中,例如按空格来分割字符串:
mystring = "The quick brown fox"
mylist = mystring.split(' ')
print(mylist)
# ['The', 'quick', 'brown', 'fox']
12、将列表中的字符串合并到一起
与上一条的功能正好相反,从列表中创建字符串,并在两个单词间插入空格:
mylist = ['The', 'quick', 'brown', 'fox']
mystring = " ".join(mylist)
print(mystring)
# 'The quick brown fox'
也许你会疑惑,为什么不使用mylist.join(" ")呢?归根结底,String.join()函数不仅可以连接列表,还可以连接任何可迭代的列表。将它放在String中会阻止在多个位置实现相同的功能。
13、Emoji
这些表情具有很强的表达能力,能给人留下深刻印象。更重要的是,这在分析社交媒体数据时尤其有用。
首先通过以下命令安装emoji模块:
pip3 install emoji
可以按照以下方法使用表情:
import emoji
result = emoji.emojize('Python is :thumbs_up:')
print(result)
# 'Python is ????'# You can also reverse this:
result = emoji.demojize('Python is ????')
print(result)
# 'Python is :thumbs_up:'
更多复杂的例子以及文档,参见:
https://pypi.org/project/emoji/
14、列表切片操作
列表切片的基本语法是:
a[start:stop:step]
start,stop和step都是可选的(可填可不填),默认值是:
start:0
stop:列表的末尾
step:1
一些例子如下:
# We can easily create a new list from
# the first two elements of a list:
first_two = [1, 2, 3, 4, 5][0:2]
print(first_two)
# [1, 2]# And if we use a step value of 2,
# we can skip over every second number
# like this:
steps = [1, 2, 3, 4, 5][0:5:2]
print(steps)
# [1, 3, 5]# This works on strings too. In Python,
# you can treat a string like a list of
# letters:
mystring = "abcdefdn nimt"[::2]
print(mystring)
# 'aced it'
15、翻转字符串和列表
可以用切片操作来翻转列表或字符串,将step设置为负值即可实现:
revstring = "abcdefg"[::-1]
print(revstring)
# 'gfedcba'revarray = [1, 2, 3, 4, 5][::-1]
print(revarray)
# [5, 4, 3, 2, 1]
16、图片显示
可以通过Pillow模块来显示图片,例如显示Kitty小猫,首先安装python图片库:
pip3 install Pillow
然后下载你要显示的图片,并重命名。然后可以通过以下命令来显示图片:
from PIL import Imageim = Image.open("kittens.jpg")
im.show()
print(im.format, im.size, im.mode)
# JPEG (1920, 1357) RGB
或者也可以直接通过IPython来显示:
Pillow的功能远不止显示图片。它可以对图片进行分析,调整大小,滤波,增强,变形等等。更多资料详见文档:
https://pillow.readthedocs.io/en/stable/。
17、使用map()函数
Python的一个内建函数是 map()。map()的基本语法是:
map(function, something_iterable)
传入的参数是一个函数,和一个需要执行的对象,可以是任何可迭代对象。在下面的例子中使用的是list:
def upper(s):return s.upper()mylist = list(map(upper, ['sentence', 'fragment']))
print(mylist)
# ['SENTENCE', 'FRAGMENT']# Convert a string representation of
# a number into a list of ints.
list_of_ints = list(map(int, "1234567")))
print(list_of_ints)
# [1, 2, 3, 4, 5, 6, 7]
map()是一个代替循环的好方式,可以在你的代码中尝试使用map()函数。
18、从列表或字符串中获取唯一元素
通过set()函数可以将列表或字符串转换为集合,集合中的不含重复元素:
mylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]
print (set(mylist))
# {1, 2, 3, 4, 5, 6}# And since a string can be treated like a
# list of letters, you can also get the
# unique letters from a string this way:
print (set("aaabbbcccdddeeefff"))
# {'a', 'b', 'c', 'd', 'e', 'f'}
19、找出最常出现的值
查找列表或字符串中最常出现的值:
test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
print(max(set(test), key = test.count))
# 4
你可以尝试自行理解上述代码。
好吧,也许你并没有尝试。上述代码的工作原理如下:
max()将返回列表中的最大值。key参数接受单个参数函数确定定制排序顺序,在本例中,它是test.count,该函数应用于iterable对象中的每个元素。
.count()是列表的一个内建函数,该函数接收一个参数,并计算该参数的出现次数。因此在本例中,test.count(1)返回2,testcount(4)返回4。
set(test)返回test列表中的所有唯一值,因此是{1,2,3,4}。
因此在上面的这行语句中我们首先找出了test列表的所有独特值,即{1,2,3,4}。接着,将.count函数应用于set中的每个值,得到一个数量列表,然后通过max找出数量最大的值。
20、创建进度条
可以自行创建进度条,但也可以通过progress模块来快速创建:
pip3 install progress
然后通过以下代码来创建进度条:
from progress.bar import Barbar = Bar('Processing', max=20)
for i in range(20):# Do some workbar.next()
bar.finish()
效果如下:
21、在交互式shell中使用用 _ 来获取上一个表达式的运行结果
可以使用下划线操作符来获取最后运行的表达式的输出,在IPython中操作如下:
In [1]: 3 * 3
Out[1]: 9
In [2]: _ + 3
Out[2]: 12
这种方法在python shell中也是适用的,IPython还可以通过Out[n]来获取任意第n个表达式的输出结果。
22、快速创建web服务器
您可以快速启动web服务器,来提供当前工作目录的内容:
python3 -m http.server
如果您想与同事共享一些内容,或者想测试一个简单的HTML站点,这是非常有用的。
23、多行字符串
虽然可以使用三重引号在代码中包含多行字符串,但这并不理想。在三重引号之间的所有内容都变成字符串,包括格式。相比我更喜欢第二种方式,它将多行连接在一起,允许你很好地格式化代码。惟一的缺点是需要显式地放入新行:
s1 = """Multi line strings can be putbetween triple quotes. It's not idealwhen formatting your code though"""
print (s1)
# Multi line strings can be put
# between triple quotes. It's not ideal
# when formatting your code though
s2 = ("You can also concatenate multiple\n" +
"strings this way, but you'll have to\n"
"explicitly put in the newlines")
print(s2)
# You can also concatenate multiple
# strings this way, but you'll have to
# explicitly put in the newlines
24、用于条件赋值的三元运算符
这是另一种使你代码变得简洁,同时保持可读性的方法:
[on_true] if [expression] else [on_false]
一个简单的例子如下:
x = "Success!" if (y == 2) else "Failed!"
25、统计元素的出现次数
可以使用Collections依赖包中的Counter方法来获得一个包含列表中所有惟一元素计数的字典:
from collections import Countermylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]
c = Counter(mylist)
print(c)
# Counter({1: 2, 2: 1, 3: 1, 4: 1, 5: 3, 6: 2})# And it works on strings too:
print(Counter("aaaaabbbbbccccc"))
# Counter({'a': 5, 'b': 5, 'c': 5})
26、比较运算符的连接
可以在python中链接比较运算符,从而使代码更简洁,可读性更强:
x = 10
# Instead of:
if x > 5 and x < 15:
print("Yes")
# yes
# You can also write:
if 5 < x < 15:
print("Yes")
# Yes
27、加入色彩
通过 Colorama 依赖包,可以在终端中添加更多色彩:
from colorama import Fore, Back, Style
print(Fore.RED + 'some red text')
print(Back.GREEN + 'and with a green background')
print(Style.DIM + 'and in dim text')
print(Style.RESET_ALL)
print('back to normal now')
关于Colorama依赖包的更多信息,参见:
https://pypi.org/project/colorama/
28、日期处理
python-dateutil模块为标准的datetime模块提供了强大的扩展。首先安装该模块:
pip3 install python-dateutil
你可以用这个库做很多很酷的事情。我讲把我认为特别有用的一个功能作为示例:日志文件中日期的模糊解析等。如下:
from dateutil.parser import parse
logline = 'INFO 2020-01-01T00:00:01 Happy new year, human.'
timestamp = parse(log_line, fuzzy=True)
print(timestamp)
# 2020-01-01 00:00:01
只要记住,如果datatime不具备某个功能,那datautil一定有该功能,datautil是datatime功能的延续。
29、整除
在Python 2中,除法运算符(/)默认为整数除法,除非其中一个操作数是浮点数。如下:
# Python 2
5 / 2 = 2
5 / 2.0 = 2.5
在python3中,除法运算符/默认为浮点除法,//运算符变成了整数除法。所以有:
Python 3
5 / 2 = 2.5
5 // 2 = 2
对于这种变化背后的完整动机,可以阅读PEP-0238:
https://www.python.org/dev/peps/pep-0238/
30、通过chardet检测字符集合
可以使用chardet模块来检测文件中的字符集合。这在分析大量随机文本时非常有用。安装chardet模块:
pip install chardet
现在你有了一个额外的命令行工具chardetect,它可以这样使用:
chardetect somefile.txt
somefile.txt: ascii with confidence 1.0
你也可以通过编程的方式来使用这个依赖包,详见技术文档:
https://chardet.readthedocs.io/en/latest/usage.html
以上就是30个python的技巧,希望这些技巧能帮助你在新的一年里有个不错的开始。
(*本文为AI科技大本营编译文章,转载请微信联系1092722531)
◆
精彩推荐
◆
点击阅读原文,或扫描文首贴片二维码
所有CSDN 用户都可参与投票活动
加入福利群,每周还有精选学习资料、技术图书等福利发送
点击投票页面「讲师头像」,60+公开课免费学习
推荐阅读
只需3行代码自动生成高性能模型,支持4项任务,亚马逊发布开源库AutoGluon
AbutionGraph:构建以知识图谱为核心的下一代数据中台
微信9年:张小龙指明方向,微信AI全面开放NLP能力
想知道与你最般配的伴侣长什么样?这个“夫妻相”生成器要火
2020年趋势一览:AutoML、联邦学习、云寡头时代的终结
达摩院 2020 预测:感知智能的“天花板”和认知智能的“野望”
十大新兴前端框架大盘点
联盟链走向何方
拿下微软、Google、Adobe,印度为何盛产科技圈 CEO?
你点的每个“在看”,我都认真当成了AI
相关文章:

点击通知栏后打开Activity,并传参
为什么80%的码农都做不了架构师?>>> Reciver中intent new Intent(context, MessageDetailsaActivity_.class);intent.putExtra("freshMessageId", String.valueOf(push.getObid()));intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Inten…

WMI技术介绍和应用——执行方法
在之前的博文中,我们主要介绍了如何使用WMI查询信息和接收事件。本文将介绍WMI的另一种用法——执行方法。(转载请指明出于breaksoftware的csdn博客) 这块的内容在msdn中有详细的介绍,如果想看原版的可以参阅《Example: Calling a…

动态指定超链接参数的几种方法(Passing a JavaScript variable into href of )
情景:有些环境下我们需要根据页面中JavaScript变量的值来确定某个(某些)超链接的参数,如“http://www.bla.com/test.aspx?var1”中,究竟var1等于多少,要根据JavaScript变量来判定 方法一:很简单…

知乎「致知计划之科学季」颁奖,创作者分享80万元奖金
1月11日,「致知计划之科学季」颁奖典礼在北京798艺术中心举行,近500名创作者到场参加。 为了激励创作者,推动优质内容持续产出,知乎的「致知计划」从四个方面对创作者进行了扶持。一是流量扶持,让专业、优质的内容获得…

Inno Setup制作应用程序安装包
我最近写了一个MFC应用程序,想发给其他的小伙伴玩一玩,直接发了个exe文件过去,结果发现小伙伴那边打不开。原来这个exe文件虽然是MFC静态编译的,但是还依赖了其他几个.dll文件,需要把这几个dll文件和exe文件放在同一个…

WMI技术介绍和应用——事件通知
在《WMI技术介绍和应用——WMI概述》中,我们使用了下图介绍WMI构架(转载请指明出于breaksoftware的csdn博客) 我们之前介绍的使用WMI查询系统、硬件等信息的功能,是通过查询WMI静态数据的空间实现的。这个功能的核心是在上图中2&a…

OpenWebSpider 安装使用
OpenWebSpider 是一个很好用的网络爬虫,也可以叫做“网络蜘蛛”. 安装: 1.使用Vs.net 2003 编译, 记得要copy libmysql.dll到工程里 2.配置文件openwebspider.conf 将已经启动了的 mysql数据库用户名,密码填写好 3.数据库建立 执行 sql_struc…
杂谈 | 当前知识蒸馏与迁移学习有哪些可用的开源工具?
所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项,还有更多福利赠送作者&编辑 | 言有三来源 | 有三AI(ID:yanyousan_ai)【导读】知识蒸馏与迁移学习不仅仅属于模型优化的重要技术之一,也是提升模型跨领域泛化能力的重要技…

对 Thinking in java 4th Edition I/O DirList.java的疑问
2019独角兽企业重金招聘Python工程师标准>>> 以下原文代码: //: io/DirList.java // Display a directory listing using regular expressions. // {Args: "D.*\.java"} import java.util.regex.*; import java.io.*; import java.util.*; pub…

WMI技术介绍和应用——Instance/Method Provider
在《WMI技术介绍和应用——事件通知》一文中,我们提到了提供者(Provider)这个概念。我们还是要引入WMI的结构图(转载请指明出于breaksoftware的csdn博客) 我们在1这层的Native C/C里可以看到若干Provider,这…

SSH 组建轻量级架构 附录 -- 遇到的问题和解答
action: nulljava.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn解决方法:加载 spring.jar 包 报 无法初始化at org.apache.struts.action.ActionServlet.initModulePlugIns(解决方法:删除 asm-2.2.3.jar springda…
TIOBE 1月编程语言排行榜:C语言再度「C 位」出道,Python惜败
整理 | 屠敏来源 | CSDN(ID:CSDNnews)【导读】在 2020 年初雪来临之际,TIOBE 官方在最新发布的 1 月编程语言榜单中为我们最终揭开了「 2019 年度编程语言」的神秘面纱,然意料之外情理之中,获此殊荣的并非是…

my项目的总结2015.8.26编
这已经是上上个星期的事了,现在回顾一下: 负责的模块是"my",更精准的说应该是my里面的个人信息管理 由于项目分域,模块已经分好了,涉及到的只是在现有的基础上解决分域后遗留的历史问题 上点图吧:…
WMI技术介绍和应用——Event Provider
在《WMI技术介绍和应用——Instance/Method Provider》一文中,我们介绍了Instance和Method Provider的编写方法。本文我们将介绍更有意思的“事件提供者”。在《WMI技术介绍和应用——事件通知》中,我们曾经提到事件是分为两种:intrinsic eve…

Windows server 2003 IP路由配置
1、静态路由:在静态路由中必须明确指出从源到目标所经过的路径2、默认路由:默认路由是一种特殊的静态路由,为那些在路由表中没有找到明确匹配的路由信息的数据包指定下一步跳地址。在Windows server 2003的计算机上配置默认网关时就为该计算机…
人工智能的下一个前沿:识别“零”和“无”
所有参与投票的 CSDN 用户都参加抽奖活动群内公布奖项,还有更多福利赠送作者 | Max Versace译者 | 夕颜出品 | AI科技大本营(ID:rgznai100)声明:本文为客座文章,仅是为作者的观点,不代表 IEEE Spectrum 或 …

File Operations In Java
2019独角兽企业重金招聘Python工程师标准>>> The “File” class in Java defines many useful methods, here is a program which demonstrates some of these methods. import java.io.*;public class streams {public static void main(String []args){File f1ne…
Cascade RPN,结构的艺术带来极致提升 | NeurIPS 2019
作者 | VincentLee来源 | 晓飞的算法工程笔记(ID: gh_084c810bc839)导读:论文提出Cascade RPN算法来提升RPN模块的性能,该算法重点解决了RPN在迭代时anchor和feature不对齐的问题,论文创新点足,效果也很惊艳…

IIS+PHP+MySQL+Zend Optimizer+GD库+phpMyAdmin安装配置[完整修正实用版]
IISPHPMySQLZend OptimizerGD库phpMyAdmin安装配置[完整修正实用版]IISPHPMySQLZend OptimizerGD库phpMyAdmin安装配置[完整修正实用版][补充]关于参照本贴配置这使用中使用的相关问题请参考关于WIN主机下配置PHP的若干问题解决方案总结这个帖子尽量自行解决,谢谢[url]http://b…

WMI技术介绍和应用——Event Consumer Provider
在《WMI技术介绍和应用——Event Provider》和《WMI技术介绍和应用——接收事件》中,我们展现了如何处理和事件相关的WMI知识。而《WMI技术介绍和应用——接收事件》一文则主要讲解了如何查询事件,这种查询是在我们进程存在时发生的,一旦我们…

shell练习四
2019独角兽企业重金招聘Python工程师标准>>> 模拟linnux登录shell #!/bin/bash echo -n "login:" read name echo -n "passwd:" read passwdif [ $name"aaa" -a passwd"aaa" ]; thenecho "the host and passwd is rig…

WMI技术介绍和应用——总结(完)
断断续续的,历经三年将WMI这个主题给写完了。记得最开始时接触该技术,是因为传统获取CPU序列号的方法总是出错。于是接触了这种已经很老的技术。本着打破砂锅问到底的想法,我决定稍微研究一下,结果越来越深。正好借着年前这点时间…
2020年,大火的Python和JavaScript是否会被取而代之?
作者 | Richard Kenneth Eng 译者 | 明明如月,编辑 | 郭芮 来源 | CSDN(ID:CSDNnews) Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一样跌下神坛…

WaveSwipeRefreshLayout
WaveSwipeRefreshLayout 介绍: 水滴效果的下拉刷新,效果非常不错。 http://itlanbao.com/code/20150815/10000/100423.html 运行效果: 相关代码 android Gallery 图片滚动 BalloonPerformerCountryRankDelightfulMenuDrawableFancyBackground…

Google Test(GTest)使用方法和源码解析——概况
GTest是很多开源工程的测试框架。虽然介绍它的博文非常多,但是我觉得可以深入到源码层来解析它的实现原理以及使用方法。这样我们不仅可以在开源工程中学习到实用知识,还能学习到一些思想和技巧。我觉得有时候思想和技巧是更重要的。(转载请指…
Reddit票选 | 2019年绝对不能错过的机器学习论文
来源 | reddit.com编辑 | 神经星星 神经小兮技术顾问 | 姜汉(openbayes.com)来源 | HyperAI超神经(ID:HyperAI)【导读】回顾 2019 年,人工智能领域时有大事发生,吸引着各界人士的关注。这一年,也…

ASP中的常用服务器检测源码
在写ASP网页时常用的检测代码:服务器现在时间: 引用<% now %>服务器CPU型号: 引用<%Request.ServerVariables("HTTP_UA_CPU")%>当前分辨率: 引用<% Request.ServerVariables("HTTP_UA_PIXELS")%>可显示颜色:[qoute]<%Request.ServerV…

选IDC房时,用脚本截取丢失包和rtt的值作比对
由于业务增长,需要选一个IDC房托管接入。网络质量要求比较高。在IDC给出测试机时,利用smokping来测试,是测出去的包。由于我们在各个地区都有接入机。再从这些接入机去测IDC网络质量,比对指标:丢失的包和rtt返回时延。…
Google Test(GTest)使用方法和源码解析——自动调度机制分析
在《Google Test(GTest)使用方法和源码解析——概况 》一文中,我们简单介绍了下GTest的使用和特性。从这篇博文开始,我们将深入代码,研究这些特性的实现。(转载请指明出于breaksoftware的csdn博客) 测试用例的自动保存…

D3D中简单的截图方法 (转)
【ZT】D3D中简单的截图方法 试了下,果然可以。在渲染完所有东东后(Present之前) 获得BackBuffer表面 然后用D3DX的函数保存 voidScreenShot (char*filename) { IDirect3DSurface9 *tmp NULL; IDirect3DSurface9 *back NULL; //生成固定…