CentOS APR攻击的防止

1.  mac 和 IP 绑定
arp -s IP地址 MAC地址
2.  还需要把绑定的mac地址告诉网关
ARPing -U -I 发送包的网卡接口 -s 源ip 目的ip
实例:

假设你的eth0接口对应的ip为192.168.1.1,网关为192.168.1.255你就可以使用

ARPing -U -I eth0 -s 192.168.1.1 192.168.1.255

--------------------------------------------------------------------------------

-s src_ip 指定源ip为src_ip

-I ethi 指定使用ethi网卡

相关命令参数表 -c n 发送n个数据报数目后退出程序

-w sec sec秒后退出程序

-f 收到一个回复包就退出程序

-q quiet安静模式

-V 显示版本

discuz7.0 升级到 discuz 7.2 再升级到dzx2

1.  ucenter的升级
如果你的ucenter是1.0版本,那么先升级到1.5.2
首先参看以下教程(此教程同样适用于1.5.0,1.5.1, 1.5.2)
http://faq.comsenz.com/viewnews-452

如果你的ucenter是1.5.0 或者 1.5.1 要想升级到 1.5.2 那么直接 下载1.5.2的程序,覆盖原来的程序即可。
注意: upload 目录中的 install 和 upgrade 目录不需要上传,如果已经上传,请使用ftp删除他
程序下载地址:
UCenter1.5.1
http://download.comsenz.com/UCenter/1.5.1/
UCenter1.5.2
http://download.comsenz.com/UCenter/1.5.2/

下面是ucenter1.5.2 到ucenter1.6的升级教程
http://www.discuz.net/thread-2141455-1-1.html

loadrounner

昨天装了一整天的loadrounner8.1版本,因为一开始用的不是自己装的,没想到loadrounner从卸载到重新安装如此的麻烦
现在记录一下成功安装的步骤吧:
1.setup.exe安装,直至需要填写序列号处,会有个默认的8888-88888888之类的,不用修改,直接点击next;
2.安装最后让你重新启动,也暂时不要重新启动,把破解文件 lm70.dll,mlr5lprg.dll
4h.A Hs1VN Ce242309这两个文件复制并粘贴到LR8.1安装目录下的bin文件夹下,一般是C:\Program Files\Mercury\LoadRunner\bin;
3.重新启动系统,启动LR,菜单项“CONFIGURATION”-->“LoadRunner License”下选中“LicenseKey1”,点击“New License”输入7.8、8.0通用的license:51Testing软件测试网?
golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
.NT7TP6e1[VU3pG242309web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB(我输入的是这个)即可
上面两个license,第一个是100个用户(无时间限制),第二个是10000个用户(有时间限制)。
如果是卸载后重新安装loadrounner,记得千万要卸干净,要不然license无法填入。
昨天安装好以后出现录制脚本0 events的现象,不过修改IE的高级选项,取消选中“启用第三方浏览器扩展*”(我用的是IE8,应该每个版本的描述都差不多)可以了。但是今天一来一用又那样了,真搞不清楚是怎么回事?看来今天又要重新研究这个问题了,而且昨天录制了脚本还出现录制程序错误的提示,录完点击stop就异常退出了,也不清楚是什么问题?
卸载LR8.1
一直认为LR只有重装系统才能在装,每次装LR都要求自己只许成功,不许失败,下面的方法是我转来的,非常受用,适合新手,呵呵。
一、卸载LR8.1程序
1.保证所有LoadRunner的相关进程(包括Controller、VuGen、Analysis和Agent Process)全部关闭。
2.在操作系统控制面板的“删除与添加程序”中运行LoadRunner的卸载程序。
3.删除整个LoadRunner目录。(包括Agent Process)
4.在搜索中查找下列文件,并且删除它们。
1) wlrun.*
2) vugen.*
二、删除注册表(最重要的)
1.运行注册表程序(开始- 运行- regedit)
2.删除下列键值。
HKEY_CLASSES_ROOT\Mercury.Lm70Control
HKEY_CLASSES_ROOT\Mercury.Lm70Control.1
同时删除
Mercury.Lm70ControlMgr
Mercury.Lm70ControlMgr.1
一定要多查找几遍,发现Lm70Contro字样的东西都要删除掉!
3.最后删除下面内容:
HKEY_CURRENT_USER\Software\Mercury Interactive\LoadRunner
HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner
这些步骤都走了一遍,确定注册表里没有那些关键字以后,重启一下电脑,开始安装LR9.0!!
我的解压过程没有遇到其他网友说的问题,直接双击运行,一直顺利通过!
loadrunner9.0破解方法
1、过程和方法:
打开Loadrunner,发现以下几个dll可能和注册有关,mlr5lprg.dll、licensebundles.dll、lm50.dll、lm70.dll。
如果熟悉LR的朋友,LR7.8、8.0、8.1中都没有Licensebundles.dll,这是一个新的综合捆绑dll,所以我在之前的一些朋友的帖子里说破解难度大,也是这个原因。
但是万幸的是,我在LR8.1.4.0中发现了licensebundles.dll,也就是LR8.1打上FP4补丁,并且用我以前的针对LR8.1的办法有效,因此,LR9.0的破解方案也就很快出现:
a、用LR8.1.4.0中的lm50.dll、licensebundles.dll覆盖LR9.0安装目录下“bin”文件夹中的对应文件;
b、用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR9.0安装目录下“bin”文件夹中的对应文件;
c、然后使用老的注册码就可以使用了;
d、golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI    web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
2、遇到的问题
在破解的过程中我还遇到了个问题,就是通过上述的方法注册时提示“License security violation……”,无法注册,后通过针对LR注册表删除的工具运行后再注册就通过了。
(这个问题我也没有遇到,直接输入了License就可以了)
安装完毕后,通过简单录制查看安装是不是真的成功,就在这时问题出现了!
1.LR打开IE后IE不自动出来
2.在LR打开的IE中访问不到服务,并且服务正常
还好,在网上搜索到了云层老师的博客,里面正好有这方面的解决方法:
1.这个问题还是IE的,找到IE的高级选项,里面有个第三方扩展支持,去掉就行了
2.这个问题是LR8.x系列会篡改IE的代理设置,关闭LR,打开IE中的选项,找到代理服务器,把最下面的对本地不使用代理服务器勾上,再把上面的使用代理服务器去掉,打开LR在录制选项中将代理设置为无。
再次录制,OK,成功!!
软件测试工具LoadRunner常见问题整理
1.LoadRunner录制脚本时为什么不弹出IE浏览器?
当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决。
启动浏览器,打开Internet选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可解决问题
提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。
2.录制Web脚本时,生成的脚本中存在乱码该如何解决?
录制脚本前,打开录制选项配置对话框Record-Options,进入到Advanced标签,先勾选“Support charset”,然后选择中支持UTF-8。再次录制,就不会出现中文乱码问题了。
3.HTML-based script与URL-based script的脚本有什么区别?
使用“HTML-based script”的模式录制脚本,VuGen为用户的每个HTML操作生成单独的步骤,这种脚本看上去比较直观;使用“URL-based script”模式录制脚本时,VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求,然后为用户的每个请求分别生成对应方法。
通常,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议,这时使用“URL-based script”模式进行录制。
4.为什么脚本中添加了检查方法Web-find,但是脚本回放时却没有执行?
由于检查点功能会耗费一定的资源,因此LoadRunner默认关闭了对文本及图像的检查。要想开启检查功能,必须修改运行时的配置Run-time Setting。
进入“Run-time Setting”对话框,依次进入“Internet Protocol→Preferences”,勾选Checks下的“Enable Image and text check”选项即可。
检查执行结果时推荐使用web_reg_find方法。
5.运行时的Pacing设置主要影响什么?
Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法:上次迭代结束后立刻开始、上次迭代结束后等待固定时间、按固定或随机的时间间隔开始执行新的迭代。
根据实际需要设置迭代即可。通常,没有时间间隔会产生更大的压力。
6.运行时设置Log标签中,如果没有勾选“Enable logging”,则手工消息可以发送吗?
Enable logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选,虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。
7.LoadRunner 8.0版本的VuGen在录制Web Services协议的脚本时一切正常,而回放时报出错误提示“Error:server returned an incorrectly formatted SOAP response”。这时说明原因引起的?
造成这种情况的主要原因是LoadRunner 8.0的VuGen在录制Web Service协议的脚本时存在一个缺陷:如果服务器的操作系统是中文的,VuGen会自动将WSDL文件的头改为,因此会有上面的错误提示。
解决方法:把“LR80WebservicesFPI_setup.exe”和“lrunner_web_sevices_path_1.exe”两个补丁打上即可解决。
8.VuGen支持Netscape的客户证书吗?
不支持。目前的VuGen 8.0版本中仅支持Internet Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书,然后将其导入到Internet Explorer中,并确保以相同的顺序导出和导入这些证书。而且,在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。
9.VuGen会修改录制浏览器中的代理服务器设置吗?
会修改。在开始录制基于浏览器的Web Vuser脚本时,VuGen首先会启动指定的浏览器。然后,VuGen会指示浏览器访问VuGen代理服务器。为此,VuGen会修改录制浏览器上的代理服务器设置。默认情况下,VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后,VuGen会将原始代理服务器设置还原到该录制浏览器中。因此,在VuGen进行录制的过程中,不可以更改代理服务器设置,否则将无法正常进行。
10.在LoadRunner脚本如何输出当前系统时间?
LoadRunner提供了char *ctime(const time_t *time)函数,调用参数为一个Long型的整数指针,用于存放返回时间的数值表示。
调用语句与返回值如下示例:
typedef long time_t;
Action()
{
time_t t;
lr_message(“Time in seconds since 1/1/70: %ld\n”,time(&t));
lr_message(“System time and date: %s”,ctime(&t));
}复制代码
输出结果为:
Time in seconds since 1/1/70: 1185329968
System time and date:Wed Jul 25 10:19:28 2007
11.一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次。为什么从第二次迭代开始发生错误?
这种现象多是由于在“Run-time Setting”的“Browse Emulation”的设置中,勾选了“Simulate a new user on each iteration”及其下面的选项“Clear cache on each iteration”这两个选项的含义是每次迭代时模拟一个新的用户及每次迭代时清除缓存。
由于脚本迭代时,init和end只能执行一次,如果每次迭代都模拟一个新的用户并清除缓存,
则用户登录信息将一并清除,因此迭代时可能会发生错误。
12.虚拟客户脚本“Run-time Setting”中的线程和进程运行方式的区别?
如果选择“Run Vuser as a process”,则场景运行时会为每一个虚拟用户创建一个进程;选择“Run Vuser as a thread”则将每个虚拟用户作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力,时默认选项。
另外,如果启用了IP欺骗功能,则先在Controller中选中Tools菜单下的“Expert Mode”,然后将Tools菜单下的“Options>General”标签页中的IP地址分配方式也设置为与Vuser运行方式一致,同为线程或进程方式。
13.在Controller中运行Web相关测试场景时,经常会有很多超时错误提示,如何处理这类问题?
这主要有脚本的默认超时设置引起。当回放Web脚本时,有时候由于服务器响应时间较长,会产生超时的错误。这时需要修改脚本的运行时配置。
进入“Run-time Setting”对话框后,依次进入“Internet Protocol→Preference”。然后点击“Options…”按钮,进入高级设置对话框,可以修改各类超时设置的默认值。
14.为什么Windows系统中的CPU、内存等资源仍然充足,但是模拟的用户数量却上不去?
在Windows计算机的标准设置下,操作系统的默认限制只能使用几百个Vuser,这个限制与CPU或内存无关,主要是操作系统本身规定了默认的最大线程数所导致。要想突破Windows这个限制,须修改Windows注册表。以Windows XP Professional为例。
(1)打开注册表后,进入注册表项HKEY_LOCAL_MACHINE中的下列关键字:System\CurrentControlSet\Control\Session Manager\SubSystems。
(2)找到Windows关键字,Windows关键字如下所示:
%SystemRoot%\system32\csrss.exe bjectDirectory=\Windows
SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1
ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2
ProfileControl=Off MaxRequestThreads=16
SharedSection=1024,3072,512关键字的格式为xxxx,yyyy,zzz。其中,xxxx定义了系统范围堆的最大值(以KB为单位),yyyy定义每个桌面堆得大小。
(3)将yyyy的设置从3072更改为8192(即8MB),增加SharedSection参数值。
通过对注册表的更改,系统将允许运行更多的线程,
因而可以在计算机上运行更多的Vuser。这意味着能够模拟的最大并发用户数量将不受Windows操作系统的限制,而只受硬件和内部可伸缩性限制的约束。

python 变量

仅仅使用字面意义上的常量很快就会引发烦恼——我们需要一种既可以储存信息 又可以对它们进行操作的方法。这是为什么要引入 变量 。变量就是我们想要的东西——它们的值可以变化,即你可以使用变量存储任何东西。变量只是你的计算机中存储信息的一部分内存。与字面意义上的常量不同,你需要一些能够访问这些变量的方法,因此你给变量名字。

标识符命名
变量是标识符的例子。 标识符 是用来标识 某样东西 的名字。在命名标识符的时候,你要遵循这些规则:

标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’)。

标识符名称的其他部分可以由字母(大写或小写)、下划线(‘ _ ’)或数字(0-9)组成。

标识符名称是对大小写敏感的。例如,myname和myName不是一个标识符。注意前者中的小写n和后者中的大写N。

有效 标识符名称的例子有i、__my_name、name_23和a1b2_c3。

无效 标识符名称的例子有2things、this is spaced out和my-name。


数据类型
变量可以处理不同类型的值,称为数据类型。基本的类型是数和字符串,我们已经讨论过它们了。在后面的章节里面,我们会研究怎么用类创造我们自己的类型。

下一页
python 对象

python的if语句

if语句用来检验一个条件, 如果 条件为真,我们运行一块语句(称为 if-块 ), 否则 我们处理另外一块语句(称为 else-块 )。 else 从句是可选的。#!/usr/bin/python
# Filename: if.py

number = 23
guess = int(raw_input('Enter an integer : '))

if guess == number:
    print 'Congratulations, you guessed it.' # New block starts here
    print "(but you do not win any prizes!)" # New block ends here
elif guess < number:
    print 'No, it is a little higher than that' # Another block
    # You can do whatever you want in a block ...
else:
    print 'No, it is a little lower than that'
    # you must have guess > number to reach here

print 'Done'
# This last statement is always executed, after the if statement is executed
输出$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done
$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done
$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done
它如何工作
在这个程序中,我们从用户处得到猜测的数,然后检验这个数是否是我们手中的那个。我们把变量number设置为我们想要的任何整数,在这个例子中是23。然后,我们使用raw_input()函数取得用户猜测的数字。函数只是重用的程序段。我们将在下一章学习更多关于函数的知识。

我们为内建的raw_input函数提供一个字符串,这个字符串被打印在屏幕上,然后等待用户的输入。一旦我们输入一些东西,然后按回车键之后,函数返回输入。对于raw_input函数来说是一个字符串。我们通过int把这个字符串转换为整数,并把它存储在变量guess中。事实上,int是一个类,不过你想在对它所需了解的只是它把一个字符串转换为一个整数(假设这个字符串含有一个有效的整数文本信息)。

接下来,我们将用户的猜测与我们选择的数做比较。如果他们相等,我们打印一个成功的消息。注意我们使用了缩进层次来告诉Python每个语句分别属于哪一个块。这就是为什么缩进在Python如此重要的原因。我希望你能够坚持“每个缩进层一个制表符”的规则。你是这样的吗?

注意if语句在结尾处包含一个冒号——我们通过它告诉Python下面跟着一个语句块。

然后,我们检验猜测是否小于我们的数,如果是这样的,我们告诉用户它的猜测大了一点。我们在这里使用的是elif从句,它事实上把两个相关联的if else-if else语句合并为一个if-elif-else语句。这使得程序更加简单,并且减少了所需的缩进数量。

elif和else从句都必须在逻辑行结尾处有一个冒号,下面跟着一个相应的语句块(当然还包括正确的缩进)。

你也可以在一个if块中使用另外一个if语句,等等——这被称为嵌套的if语句。

记住,elif和else部分是可选的。一个最简单的有效if语句是:

if True:
    print 'Yes, it is true'

在Python执行完一个完整的if语句以及与它相关联的elif和else从句之后,它移向if语句块的下一个语句。在这个例子中,这个语句块是主块。程序从主块开始执行,而下一个语句是print 'Done'语句。在这之后,Python看到程序的结尾,简单的结束运行。

尽管这是一个非常简单的程序,但是我已经在这个简单的程序中指出了许多你应该注意的地方。所有这些都是十分直接了当的(对于那些拥有C/C++背景的用户来说是尤为简单的)。

下一篇  python的while循环

python 对象

记住,Python把在程序中用到的任何东西都称为 对象 。这是从广义上说的。因此我们不会说“某某 东西 ”,我们说“某个 对象 ”。

给面向对象编程用户的注释
就每一个东西包括数、字符串甚至函数都是对象这一点来说,Python是极其完全地面向对象的。

我们将看一下如何使用变量和字面意义上的常量。保存下面这个例子,然后运行程序。

如何编写Python程序
下面是保存和运行Python程序的标准流程。
   1. 打开你最喜欢的编辑器。
   2. 输入例子中的程序代码。
   3. 用注释中给出的文件名把它保存为一个文件。我按照惯例把所有的Python程序都以扩展名.py保存。
   4. 运行解释器命令python program.py或者使用IDLE运行程序。你也可以使用先前介绍的可执行的方法。

例4.1 使用变量和字面意义上的常量# Filename : var.py
i = 5
print i
i = i + 1
print i

s = '''This is a multi-line string.
This is the second line.'''
print s
输出
$ python var.py
5
6
This is a multi-line string.
This is the second line.

它如何工作
下面来说明一下这个程序如何工作。首先我们使用赋值运算符(=)把一个字面意义上的常数5赋给变量i。这一行称为一个语句。语句声明需要做某件事情,在这个地方我们把变量名i与值5连接在一起。接下来,我们用print语句打印i的值,就是把变量的值打印在屏幕上。

然后我们对i中存储的值加1,再把它存回i。我们打印它时,得到期望的值6。

类似地,我们把一个字面意义上的字符串赋给变量s然后打印它。

给C/C++程序员的注释
使用变量时只需要给它们赋一个值。不需要声明或定义数据类型。

下一页
逻辑行与物理行

pyton 的while循环

只要在一个条件为真的情况下,while语句允许你重复执行一块语句。while语句是所谓 循环 语句的一个例子。while语句有一个可选的else从句。#!/usr/bin/python
# Filename: while.py

number = 23
running = True

while running:
    guess = int(raw_input('Enter an integer : '))

    if guess == number:
        print 'Congratulations, you guessed it.'
        running = False # this causes the while loop to stop
    elif guess < number:
        print 'No, it is a little higher than that'
    else:
        print 'No, it is a little lower than that'
else:
    print 'The while loop is over.'
    # Do anything else you want to do here

print 'Done'
输出$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done
它如何工作
在这个程序中,我们仍然使用了猜数游戏作为例子,但是这个例子的优势在于用户可以不断的猜数,直到他猜对为止——这样就不需要像前面那个例子那样为每次猜测重复执行一遍程序。这个例子恰当地说明了while语句的使用。

我们把raw_input和if语句移到了while循环内,并且在while循环开始前把running变量设置为True。首先,我们检验变量running是否为True,然后执行后面的 while-块 。在执行了这块程序之后,再次检验条件,在这个例子中,条件是running变量。如果它是真的,我们再次执行while-块,否则,我们继续执行可选的else-块,并接着执行下一个语句。

当while循环条件变为False的时候,else块才被执行——这甚至也可能是在条件第一次被检验的时候。如果while循环有一个else从句,它将始终被执行,除非你的while循环将永远循环下去不会结束!

True和False被称为布尔类型。你可以分别把它们等效地理解为值1和0。在检验重要条件的时候,布尔类型十分重要,它们并不是真实的值1。

else块事实上是多余的,因为你可以把其中的语句放在同一块(与while相同)中,跟在while语句之后,这样可以取得相同的效果。

下一篇  pyton的for循环

逻辑行与物理行

物理行是你在编写程序时所 看见 的。逻辑行是Python 看见 的单个语句。Python假定每个 物理行 对应一个 逻辑行 。

逻辑行的例子如print 'Hello World'这样的语句——如果它本身就是一行(就像你在编辑器中看到的那样),那么它也是一个物理行。

默认地,Python希望每行都只使用一个语句,这样使得代码更加易读。

如果你想要在一个物理行中使用多于一个逻辑行,那么你需要使用分号(;)来特别地标明这种用法。分号表示一个逻辑行/语句的结束。例如:

i = 5
print i

与下面这个相同:

i = 5;
print i;

同样也可以写成:

i = 5; print i;

甚至可以写成:

i = 5; print i

然而,我强烈建议你坚持在每个物理行只写一句逻辑行。仅仅当逻辑行太长的时候,在多于一个物理行写一个逻辑行。这些都是为了尽可能避免使用分号,从而让代码更加易读。事实上,我 从来没有 在Python程序中使用过或看到过分号。

下面是一个在多个物理行中写一个逻辑行的例子。它被称为明确的行连接。

s = 'This is a string. \
This continues the string.'
print s

它的输出:

This is a string. This continues the string.

类似地,

print \
i

与如下写法效果相同:

print i

有时候,有一种暗示的假设,可以使你不需要使用反斜杠。这种情况出现在逻辑行中使用了圆括号、方括号或波形括号的时候。这被称为暗示的行连接。你会在后面介绍如何使用列表的章节中看到这种用法。

缩进
空白在Python中是重要的。事实上行首的空白是重要的。它称为缩进。在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句的分组。

这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。我们将在后面的章节中看到有关块的用处的例子。

你需要记住的一样东西是错误的缩进会引发错误。例如:

i = 5
print 'Value is', i # Error! Notice a single space at the start of the line
print 'I repeat, the value is', i

当你运行这个程序的时候,你会得到下面的错误:

  File "whitespace.py", line 4
    print 'Value is', i # Error! Notice a single space at the start of the line
    ^
SyntaxError: invalid syntax

注意,在第二行的行首有一个空格。Python指示的这个错误告诉我们程序的语法是无效的,即程序没有正确地编写。它告诉你, 你不能随意地开始新的语句块 (当然除了你一直在使用的主块)。何时你能够使用新块,将会在后面的章节,如控制流中详细介绍。

如何缩进
不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。我 强烈建议 你在每个缩进层次使用 单个制表符 或 两个或四个空格 。
选择这三种缩进风格之一。更加重要的是,选择一种风格,然后一贯地使用它,即 只 使用这一种风格。

下一页
运算符与表达式

pyton的for循环

for..in是另外一个循环语句,它在一序列的对象上 递归 即逐一使用队列中的每个项目。我们会在后面的章节中更加详细地学习序列。#!/usr/bin/python
# Filename: for.py

for i in range(1, 5):
    print i
else:
    print 'The for loop is over'
输出$ python for.py
1
2
3
4
The for loop is over
它如何工作
在这个程序中,我们打印了一个 序列 的数。我们使用内建的range函数生成这个数的序列。

我们所做的只是提供两个数,range返回一个序列的数。这个序列从第一个数开始到第二个数为止。例如,range(1,5)给出序列[1, 2, 3, 4]。默认地,range的步长为1。如果我们为range提供第三个数,那么它将成为步长。例如,range(1,5,2)给出[1,3]。记住,range 向上 延伸到第二个数,即它不包含第二个数。

for循环在这个范围内递归——for i in range(1,5)等价于for i in [1, 2, 3, 4],这就如同把序列中的每个数(或对象)赋值给i,一次一个,然后以每个i的值执行这个程序块。在这个例子中,我们只是打印i的值。

记住,else部分是可选的。如果包含else,它总是在for循环结束后执行一次,除非遇到break语句。

记住,for..in循环对于任何序列都适用。这里我们使用的是一个由内建range函数生成的数的列表,但是广义说来我们可以使用任何种类的由任何对象组成的序列!我们会在后面的章节中详细探索这个观点。

下一篇   python 的 break 语句

运算符与表达式

简介
你编写的大多数语句(逻辑行)都包含表达式。一个简单的表达式例子如2 + 3。一个表达式可以分解为运算符和操作数。

运算符 的功能是完成某件事,它们由如+这样的符号或者其他特定的关键字表示。运算符需要数据来进行运算,这样的数据被称为 操作数 。在这个例子中,2和3是操作数。

运算符
我们将简单浏览一下运算符和它们的用法:

技巧
你可以交互地使用解释器来计算例子中给出的表达式。例如,为了测试表达式2 + 3,使用交互式的带提示符的Python解释器:

>>> 2 + 3
5
>>> 3 * 5
15
>>>

表5.1 运算符与它们的用法




下一页
运算符优先级

python 的break语句

break语句是用来 终止 循环语句的,即哪怕循环条件没有称为False或序列还没有被完全递归,也停止执行循环语句。

一个重要的注释是,如果你从for或while循环中 终止 ,任何对应的循环else块将不执行。#!/usr/bin/python
# Filename: break.py

while True:
    s = raw_input('Enter something : ')
    if s == 'quit':
        break
    print 'Length of the string is', len(s)
输出$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something :       use Python!
Length of the string is 12
Enter something : quit
Done
它如何工作
在这个程序中,我们反复地取得用户地输入,然后打印每次输入地长度。我们提供了一个特别的条件来停止程序,即检验用户的输入是否是'quit'。通过 终止 循环到达程序结尾来停止程序。

输入字符串的长度通过内建的len函数取得。

记住,break语句也可以在for循环中使用。

下一篇  python的continue循环

python中的数

在Python中有4种类型的数——整数、长整数、浮点数和复数。

2是一个整数的例子。
长整数不过是大一些的整数。
3.23和52.3E-4是浮点数的例子。E标记表示10的幂。在这里,52.3E-4表示52.3 * 10-4。
(-5+4j)和(2.3-4.6j)是复数的例子。

下一页
python 中的字符串

python 的continue循环

continue语句被用来告诉Python跳过当前循环块中的剩余语句,然后 继续 进行下一轮循环。#!/usr/bin/python
# Filename: continue.py

while True:
    s = raw_input('Enter something : ')
    if s == 'quit':
        break
    if len(s) < 3:
        continue
    print 'Input is of sufficient length'
    # Do other kinds of processing here...
输出
$ python continue.py
Enter something : a
Enter something : 12
Enter something : abc
Input is of sufficient length
Enter something : quit

它如何工作
在这个程序中,我们从用户处取得输入,但是我们仅仅当它们有至少3个字符长的时候才处理它们。所以,我们使用内建的len函数来取得长度。如果长度小于3,我们将使用continue语句忽略块中的剩余的语句。否则,这个循环中的剩余语句将被执行,我们可以在这里做我们希望的任何处理。

注意,continue语句对于for循环也有效。

下一篇 python的函数

python 中的字符串

字符串是 字符的序列 。字符串基本上就是一组单词。

我几乎可以保证你在每个Python程序中都要用到字符串,所以请特别留心下面这部分的内容。下面告诉你如何在Python中使用字符串。

使用单引号(')
你可以用单引号指示字符串,就如同'Quote me on this'这样。所有的空白,即空格和制表符都照原样保留。

使用双引号(")
在双引号中的字符串与单引号中的字符串的使用完全相同,例如"What's your name?"。

使用三引号('''或""")
利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。例如:

'''This is a multi-line string. This is the first line.
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."
'''

转义符
假设你想要在一个字符串中包含一个单引号('),那么你该怎么指示这个字符串?例如,这个字符串是What's your name?。你肯定不会用'What's your name?'来指示它,因为Python会弄不明白这个字符串从何处开始,何处结束。所以,你需要指明单引号而不是字符串的结尾。可以通过 转义符 来完成这个任务。你用\'来指示单引号——注意这个反斜杠。现在你可以把字符串表示为'What\'s your name?'。

另一个表示这个特别的字符串的方法是"What's your name?",即用双引号。类似地,要在双引号字符串中使用双引号本身的时候,也可以借助于转义符。另外,你可以用转义符\\来指示反斜杠本身。

值得注意的一件事是,在一个字符串中,行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行。例如:

"This is the first sentence.\
This is the second sentence."

等价于"This is the first sentence. This is the second sentence."

自然字符串
如果你想要指示某些不需要如转义符那样的特别处理的字符串,那么你需要指定一个自然字符串。自然字符串通过给字符串加上前缀r或R来指定。例如r"Newlines are indicated by \n"。

Unicode字符串
Unicode是书写国际文本的标准方法。如果你想要用你的母语如北印度语或阿拉伯语写文本,那么你需要有一个支持Unicode的编辑器。类似地,Python允许你处理Unicode文本——你只需要在字符串前加上前缀u或U。例如,u"This is a Unicode string."。

记住,在你处理文本文件的时候使用Unicode字符串,特别是当你知道这个文件含有用非英语的语言写的文本。

字符串是不可变的
这意味着一旦你创造了一个字符串,你就不能再改变它了。虽然这看起来像是一件坏事,但实际上它不是。我们将会在后面的程序中看到为什么我们说它不是一个缺点。

按字面意义级连字符串
如果你把两个字符串按字面意义相邻放着,他们会被Python自动级连。例如,'What\'s' 'your name?'会被自动转为"What's your name?"。

给C/C++程序员的注释
在Python中没有专门的char数据类型。确实没有需要有这个类型,我相信你不会为此而烦恼。


给Perl/PHP程序员的注释
记住,单引号和双引号字符串是完全相同的——它们没有在任何方面有不同。


给正则表达式用户的注释
一定要用自然字符串处理正则表达式。否则会需要使用很多的反斜杠。例如,后向引用符可以写成'\\1'或r'\1'。

下一页
python 变量

Python 语言简介

Python语言是少有的一种可以称得上即简单又功能强大的编程语言。你将惊喜地发现Python语言是多么地简单,它注重的是如何解决问题而不是编程语言的语法和结构。

Python的官方介绍是:

Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程。Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使得它在大多数平台上的许多领域都是一个理想的脚本语言,特别适用于快速的应用程序开发。

我会在下一节里详细地讨论Python的这些特点。

注释
Python语言的创造者Guido van Rossum是根据英国广播公司的节目“蟒蛇飞行马戏”命名这个语言的,并非他本人特别喜欢蛇缠起它们的长身躯碾死动物觅食。

下一页
Python的特色