《“笨方法”学Python》第四版各练习笔记

该文档是《笨方法学python》(第四版)一书各节练习的笔记,共52个练习。其中包含各节练习的知识点,实践中遇到的问题及解决,以及相关知识点的自我扩充。

习题1:第一个程序(基本显示)
习题2:注释和#号
如何在程序中显示其他国家的语言文字?
在文件开头加入此语句:# -*- coding:utf-8 -*-
SyntaxError: Non-ASCII character ‘\xe4’ in file test.py on line 3, but no encoding declared; 这是python编码的问题,python中默认的编码格式是ASCII格式,所以在没修改编码格式时无法正确打印汉字。
习题3:数字和数学运算
基本数学运算返回数值结果,进行判断的数学运算返回对错。
习题4:变量和命名
可以用等号直接为变量赋值或赋字符串,赋数值的变量可以直接进行运算。
习题5:更多的变量和打印(格式化字符串)
变量也可以用“%”进行格式化输出,%s代表字符串,%d代表数值,%c单个字符,%f浮点数,最后用%变量名来替换,注意显示时变量名与语句之间没有标点符号。此外%r用于调试,不管什么都会打印出来,如果是语句,该语句打印出来后会有单引号标记。
可以用如下的方式,对格式进行进一步的控制:
%[(name)][flags][width].[precision]typecode
(name)是为此格式符命的名,flags可以有+,-,’ ‘或0。’+’表示右对齐。’-‘表示左对齐。’ ‘为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。’0’表示使用0填充。width表示显示宽度,precision表示小数点后精度
习题6:字符串和文本
如果想在语句中通过格式化字符放入更多变量,需要将变量放到圆括号中,而且变量之间用逗号隔开。给变量赋值字符串时要加引号,赋值True和False不用加引号。字符串可以用+号连接。%r用来做调试用比较好,因为他会显示变量的原始数据,当为字符时,显示时会自动加单引号,当为转意字符时不会进行转意。而%s和其他符号则是用来向客户显示输出的,遇到转意字符会自动进行转意。
习题7:更多打印
我们可以使用*来处理重复输出,字符串重复多少次就*多少。
在格式化输出语句后面加上逗号,这样下一条语句会和该语句在同一行显示,但逗号不会显示出来。
习题8:打印,打印
习题9:打印,打印,打印
字符串以\n开头,则会显示在新的一行中。
两对三个双引号连写,可以在中间打印出一批文本。
习题10:那是什么
\n换行符,\r回车符,\t水平制表符
习题11:提问(接收输入)
利用raw_input()来接收终端的输入,可以接收带空格的字符串。即使输入的为数字,但仍会以字符串的形式接收
可以利用Ctrl+D快捷键来随时退出当前python程序。
习题12:提示别人
也可以在raw_input()括号内加入提示别人需要回答的问题。注意变量在等号前。
pydoc可以显示命令帮助文档。
习题13:参数、解包和变量
用命令行参数传递变量给脚本需加抬头:from sys import argv,使用时script,first,second = argv。import语句是将Python的特性引入脚本的方法,Argv就是所谓的参数变量(argument variable)。如果参数在用户执行命令时输入,那就用argv;如果是在脚本运行过程中输入,就用raw_input()。另外命令行参数都是字符串,第一个命令行参数是脚本名称。
习题14:提示和传递
我们可以将常用的命令提示符赋给一个变量,这样每次使用raw_input()函数时可以在括号中写入该变量即可。
习题15:读取文件
可以用如下方式打开文件:txt = open(filename)。open函数会返回一个file object,可以将这个值赋给一个变量,这就是打开文件的过程。filename为字符串应加上双引号。打开的文件本身也支持一些命令,接受命令的方式是句点,例如txt.read()。另外python不会限制文件打开的次数。最后,用txt.close()来关闭文件。
习题16:读写文件
Open:打开文件,r读取模式,w写入模式,a追加模式,格式open(filename,'w');close:关闭(保存)文件;read:读取文件内容;readline:读取文本文件中的一行;truncate:截断文件。write(stuff):将stuff写入文件。使用truncate的文件需要有写入权限,如果truncate()指定了可选参数 size,则表示从文件开头 size 个字符后的内容被删除,size包含中间的所有空格。如果没有指定size,则从文件指针当前位置起后面的内容被删除。
习题17:更多的文件操作
len()函数会以数的形式返回传递字符串的长度。exists(),将文件名作为参数,文件存在时,返回True,文件不存在时返回False,使用时需添加头:from os.path import exists。
习题18:命名、变量、代码和函数
用def命令新建函数,紧跟函数名,圆括号内列明所需参数,接着用“:”结束本行,然后开始下一行缩进,冒号下有四个空格缩进的行都属于函数的内容。
例如:def print_file(*args):  或者直接:def print_file(arg1,arg2):  或者:def print_none(): arg1,arg2 = args
变量名中*args中的*号告诉python把函数的所有参数都收进来,放到名叫args的列表中去。
IndentationError: unexpected indent文件缩进格式不对,tab和空格没对齐,需要检查下tab和空格。
invalid syntax:语法错误
注意:python对代码的格式要求非常严格,哪怕是否多了一个空格。
习题19:函数和变量
函数里的变量和脚本里的变量没有关系。函数里的参数可以直接赋值,也可以用变量代替,还可以用数学表达式进行计算,甚至把变量和数学表达式结合起来。
可以使用int(raw_input())接收整数,用float(raw_input())接收浮点型数值。
习题20:函数和文件
函数的参数也可以是文件对象。read()是读取整个文件,readline()是读取文件的一行,也包含文件自带的\n换行。print打印内容可以用逗号并列在一起。seek()用来移动文件指针到指定位置,0代表从文件开头算起,1代表从当前位置算起,2代表从文件末尾算起,默认为0。
隔行问题,因为readline()会打印原文件结尾的换行,print结束时还会再打印一个换行,解决办法是在print语句结尾加一个逗号,这样print就不会把他自己的\n打印出来。
习题21:函数可以返回某些东西
return 可以让函数在结束时返回需要的值。函数还可以嵌套使用,比如利用一个函数的返回值作为另一个函数的参数。
习题22:到现在你学到了哪些东西
习题23:阅读一些代码
习题24:更多的练习
可以通过一对”””将一段文字赋值给一个变量。函数可以返回多个值,并同时赋给多个变量,例如:a,b,c = formula(start)。变量名也可以用有返回值的函数代替。
习题25:更多更多的实践
脚本也可以在python里运行。在终端输入python,进入python。然后import该脚本名称,不需要加.py后缀,此时将脚本当一个模块使用。在终端可以直接用等号对变量进行赋值,用文件名.函数名来调用文件模块里的函数。在终端直接输入变量然后回车,会显示变量的内容。help(文件名)或help(文件名.函数名)可以显示模块或函数的帮助文档,帮助文档就是定义函数时放在”“”之间的东西。
split()函数通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串。str.split(str=" ", num=string.count(str)).
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。空值或是-1代表最后一个元素,0代表第一个元素。
结束时Linux用Ctrl+D退出,Windows 用Ctrl+Z退出python。
习题26:恭喜你,现在可以考试了!
练习修改程序并使其可以正确运行。
习题27:记住逻辑关系
习题28:布尔表达式练习
习题29:if语句
if判断语句后要有冒号,命令执行语句要有缩进。
if语句的规则:①每条if最好包含一个else。②else如果永远执行不到,必须在else语句后添加die函数,让他打印出错误信息。③if语句嵌套不要超过两层。如果if里又有if,最好把第二个if移到另一个函数里。④将if语句当段落来对待,段落最前和最后各留一行以作区分。⑤布尔测试应该很简单,如果复杂需要将他们的运算事先放到一个变量里,并为变量取个好名字。
习题30:else 和if
if ***: elif***:  else: 注意每个判断命令后都会有冒号,冒号的下一行都需要缩进。
习题31:作出决定
if语句里还可以再嵌套if语句,但要注意不同等级的缩进格式。
习题32:循环和列表
用[]来创建列表,其中的元素用逗号隔开。
for循环语句格式:for item in list : 下面命令行缩进。
当不确定列表中的数据类型时,可用%r来引用。
循环的规则:只有在循环永不停止时使用while循环,其他类型的循环都是用for,尤其是在循环对象数量是固定或者有限的情况下。
判断一个数处于某个值域的俩种方法:1<x<10x in range(1,10)
函数原型:range(start,end,scan)。参数含义:计数从start开始,默认是从0开始。例如range(5)等价于range(0,5)。计数到end结束,但不包括end。例如:range(0,5) 是[0, 1, 2, 3, 4],没有5。scan是每次跳跃的间距,默认为1。例如:range(0,5)等价于range(0, 5, 1).
append():在列表尾部追加元素。
习题33:while循环
while判断语句: 下面命令行缩进。直到while 的判断语句为假的时候才退出循环。要确保判断语句有False的时候,可以退出while 循环,如果不确定,就在循环结尾打印出你要测试的值,看他的变化。
尽量少用while循环,大部分时候使用for循环更好。
习题34:访问列表中的元素
列表和数组一样下标是从0开始。
习题35:分支和函数
exit(0)表示可以中断程序,0代表程序是正常退出的,1代表发生了错误,也可以用不同的数字来表示不同的错误。
int()函数将一个数字或base类型的字符串转换成整数。int(x, base=10),base缺省值为10,也就是说不指定base的值时,函数将x按十进制处理。
str为字符串,str.isalnum()判断所有字符都是数字或者字母; str.isalpha()判断所有字符都是字母; str.isdigit()判断所有字符都是数字; str.islower()判断所有字符都是小写; str.isupper()判断所有字符都是大写; str.istitle()判断所有单词都是首字母大写。
习题36:设计和调试
调试的技巧:①不要使用调试器,它的输出信息太多大部分没用会让人产生困惑。②最好的调试方法是用print在各个想要检查的关键环节将关键变量打印出来,检查是否有错。③让程序一部分一部分运行起来,不要等一个很长的脚本写完后才去运行它,写一点运行一点,再修改一点。
习题37:复习各种符号
1、关键字:
del:用于列表操作,删除一个或几个元素,注意其删除的是变量,而不是数据对象。
not:(1)not与逻辑判断句if连用,代表not后面的表达式为False的时候,执行冒号后面的语句。(2) 判断元素是否在列表或者字典中,if a not in b,a是元素,b是列表或字典,这句话的意思是如果a不在列表或字典b中,那么就执行冒号后面的语句。
as:改变被导入模组在当前模组中的名称,可以使用import as,例如import some as other
global:全局变量的使用是为了使我们在一个类或一个函数中使用由函数返回的变量,并进行复杂的计算过程而使用。
with:with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭。基本语法如下,with EXPR as VAR: EXPR是一个任意表达式,VAR是一个单一的变量(可以是tuple),“as VAR”是可选的。
Assert:assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。格式:assert+空格+要判断语句+双引号“报错提示语句”。
pass:pass 不做任何事情,一般用做占位语句。
yield: yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
try、expect、finall:我们把可能发生错误的语句放在try模块里,用except来处理异常,finally放在最后,总是要被执行的。
import:import语句作用就是用来导入模块的,它可以出现在程序中的任何位置。
exec:exec语句用来执行储存在字符串或文件中的Python语句。
raise:引发一个异常。执行raise语句时,Python会创建指定的异常类的一个对象。
is:Python中的对象包含三要素:id、type、value。其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值。is判断的是a对象是否就是b对象,是通过id来判断的;而“==”判断的是a对象的值是否和b对象的值相等,是通过value来判断的。
lambda: lambda 是为了减少单行函数的定义而存在的。通常用在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
2、字符串转义序列:
\a蜂鸣哔的一声响,\b退格,\f打印时换页,\n回车光标在下一行行首,\r换行光标在本行行首,\t水平制表符八个空格,\v垂直制表符
3、其他符号:
**幂运算,//除法并省去余数。小括号( )代表元组数据类型,元组是一种不可变序列。中括号[ ]代表list列表数据类型,列表是一种可变的序列。{ }花括号:代表dict字典数据类型,字典是由键值对组成,冒号’:’分开键和值,逗号’,’隔开组。
习题38:阅读代码
阅读代码的方法:
通读你打印出来的代码并做好标记:1. 函数以及函数的功能。 2. 每个变量的初始赋值。 3. 每个在程序的各个部分中多次出现的变量。 4. 任何不包含 else 的 if 语句是否正确。 5. 任何可能没有结束点的 while 循环。 6. 代码中任何看不懂的部分。
接下来通过注解的方式向自己解释代码的含义。解释各个函数的使用方法, 各个变量的用途,以及任何其它方面的内容。
最后,在代码中比较难的各个部分,逐行或者逐个函数跟踪变量值。你可以再打印一份出来,在空白处写出你要“追踪”的每个变量的值。
一旦基本理解代码的功能,回到电脑面前,在屏幕上重读一次,看看能不能找到新的问题点。
习题39:列表的操作
带空格的字符串可以用split(‘ ’)函数分割出每个单词,变成字符串列表。
' '.join(Stuff[3:5])是指将空格加入到后面列表内指定位置元素的中间,该位置从列表下标为3的元素开始取值,直到下标为5的元素为止,但不包含下标5的元素。
习题40:字典,可爱的字典(散列)
列表是有序排列的一些物件,而字典是将一些物件对应到另外一些物件的数据结构。
名称[‘键’] = ‘值’,可以用此方法为字典添加键值对。
items()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。eg:print dict.items() 或者for key,values in dict.items(): print key,values
get(‘a’,None) 函数返回指定键a的值,如果该键不在字典中则返回默认值None。
习题 4 1: 来自 Percal 25 号行星的哥顿人
游戏构建:
1、用函数罗列出各个房间的游戏方法。其末尾要么包含退出程序的函数,要么包含新的返回值。
2、利用字典将房间名和房间方法一一对应起来。
3、编写主体运行函数,运行函数的参数包含地图和起始信息。
利用while True:循环保证游戏在非规定退出的情况下持续运行。
利用房间名字符串调用房间方法
通过房间方法得到新的房间名字符串,或者按规定退出游戏
将得到的新房间名字符串赋给原字符串
利用循环继续通过字符串调用其房间方法
4、执行主体运行函数,将字典赋给地图,将起始房间名赋给起始信息。
习题 4 2: 物以类聚
利用类重写上述游戏:
1、建立一个游戏类:
初始化函数:在这里预设重要的变量,还可以预设有关的信息提示
游戏函数:
*将初始信息赋给字符串
*利用while True:循环在正常情况下持续运行函数
*通过房间名字符串获得房间游戏方法
*通过房间游戏方法获得新的房间名或按规定退出
*将新的房间名赋给字符串,再进行新的循环
*罗列各个房间游戏方法,要么返回新的房间名,要么按规定退出程序
2、将类实例化,并将初始房间名赋给初始字符串
3、执行游戏类对象的游戏函数,开始游戏
getattr()函数用于通过实例返回属性值(通过字符串返回其对应的方法实例)
习题 4 3:你来制作一个游戏
主要类:
场景:有进入函数,给出各个模块的信息及选项,并返回关键值及下一个模块名称
地图:利用字典给出各个模块名称及函数的对应关系,并给出初始场景
引擎:引入地图,并利用play()函数驱动整个游戏:①当前场景=初始场景 ②开始不停循环,直到遇到exit(),循环内容:下一个场景=当前场景.enter() 当前场景=下一个场景
习题 4 4:给你的游戏打分
1、函数的风格:尽量用动词命名,尽量让函数保持简单小巧。
2、类的风格:
类的命名尽量采用驼峰式大小写,而不是用下划线。
初始化函数不应该做太多事情
你的其他函数应该使用下划线隔词
用一致的方式组织函数参数
不要对全局变量或者来自模组的变量进行重定义或者赋值
3、代码的风格:
为了以方便他人阅读,为自己的代码字符之间留下一些空白。
写注解的时候,描述清楚为什么你要这样做
习题 4 5: 对象、类、以及从属关系
以下内容结合本书第3版
一:模块、类、对象
注意init(self,name)这个初始化函数的左右下划线都是两个短横,只用了一个时会导致错误TypeError: object() takes no parameters。
单行注释用#号,多行注释用两对”“”
self是python为我们创建的空对象,如还有其他参数则创建类对象时需要赋值。
获取某样东西里包含的东西有三种方法:①字典②模块③类(需要先对类创建对象)
二:学习面向对象术语
类,对象,实例,def,self,继承,组合,属性,是什么,有什么
class X(Y):创建一个叫X的类,它是Y的一种
class X(object):def init(self,J):类X有一个init接收self和J作为参数
class X(object):def M(slef,J): 类X有一个函数名称为M,它接收self和J作为参数
foo = X(): 将foo设为类X的一个实例
foo.M(J): 从foo中找到M函数,并使用self和J参数来调用它
foo.k = Q: 从foo中获取K属性,并将其设置为Q
三:基本的面向对象分析和设计
面向对象编程基本流程:(自顶向下)
①把要解决的问题写下来,或者画出流程图
②将第一条中的关键概念摘录出来并加以研究(将内容里的名词和动词列出来,然后写出它们之间的关系)
③创建一个类和对象的层次结构图(把名词列表拿出来看看是不是类似,是否能用同一个父类,再把动词列表拿出来,看看是不是对应类的函数名称,把它们放到对应的类下)
④用代码实现各个类,并写一个测试来运行它们
⑤重复上述步骤并细化代码
(自底向上)适用于基础牢固的程序员
①取出要解决的问题中的一小块,写些代码让他差不多能工作
②细化代码让它更为正式,比如加上类和自动测试
③把关键概念抽取出来然后研究它们
④把真正需要实现的东西描述出来
⑤回去细化代码,有坑需要全部丢弃重头做起
⑥在问题的另外一小块里重复上述流程
四:继承与合成
父类和子类的三种交互方式:
隐式继承:子类中没有定义父类中的函数
显示覆盖:子类中重写了父类中定义的函数
在运行前或运行后替换:使用super(子类,self),即利用子类和self两个参数调用super可以返回父类。
多重继承是指定义的类继承多个类,多重继承应尽力避免使用。
合成:将其他类或模块赋给所使用类的一个变量,然后通过该变量调用其他类或模块的功能,以达到与继承相同的效果。尽量用合成代替继承。例如:
def __init__(self): self.变量名=其他类名()
习题 4 6:一个项目骨架
一、创建框架:project——bin(用于存放项目调试后的可执行文件),docs,tests,NAME(项目主文件夹)
二、python的安装包:
1、pip:pip是一个Python包管理工具,主要是用于安装PyPI上的软件包。
a、安装PyPI软件包:
$ pip install SomePackage # latest version
$ pip install SomePackage==1.0.4 # specific version
$ pip install 'SomePackage>=1.0.4' # minimum version
b、卸载软件包:
$ pip uninstall SomePackage
c、查看列出已安装的软件包:
$ pip list
2、distribute:这个包是一个简单的兼容层,它安装StudioTo工具0.7。
distribute是setuptools的取代,负责代码包构建和发布
3、nose:对负载测试和单元测试的运行特性进行了扩展
Nose是最流行的针对Python的测试库之一,Nose运行时会自动寻找其名称以”test_”开头的文件。跟测试模块的名称一样,测试函数的名称也必须以test_开头。通常情况下nose只会在当前的工作目录下寻找测试文件,除非使用-w参数指定。寻找文件的时候,它会搜索test开头的文件夹,文件,模块,包。特别是nose会递归的扫描整个包来寻找test测试。如果找到测试后,setup装置就会运行,然后运行测试的函数或者类。
4、virtualenv:用来创建独立的python环境的工具
virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响。环境的隔离指同一台机器上能够并行(side-by-side)部署多个python环境,每个环境之间互相独立,拥有自己的python程序、库和可执行程序。这样,既可以在一台机器上为多名开发者提供互不影响的开发环境,也能在同一台服务器上为多个应用提供互不影响的执行环境。它能够:a)在没有权限的情况下安装新套件b) 不同应用可以使用不同的套件版本c) 套件升级不影响其他应用。
mkvirtualenv <env_name> 在$WORKON_HOME创建虚拟环境
rmvirtualenv <env_name> 删除虚拟环境
workon [<env_name>] 切换到虚拟环境
deactivate 退出虚拟环境
lsvirtualenvs 列出全部的虚拟环境
cdvirtualenv [subdir] 进入虚拟环境的相应目录
习题 4 7:自动化测试
测试指南:
1. 测试脚本要放到 tests/ 目录下,并且命名为 ×××_tests.py ,否则 nosetests 就不会执行你的测试脚本了。这样做可以防止测试代码和别的代码互相混掉。 2. 为你的每一个模组写一个测试。 3. 测试用例(函数)尽量保持简短。 4. 尽量把测试用例里边重复的代码删掉。创建一些辅助函数来避免重复的代码。当你下次在改完代码需要改测试的时候,重复的代码会让修改测试变得很难操作。 5. 最后一条是别太把测试当做一回事。有时候,更好的方法是把代码和测试全部删掉, 然后重新设计代码。
Room类测试分析:先测试类变量是否正确赋值,再测试一步执行的类函数是否运行正确,最后综合测试几步递进执行的类函数能否协同工作。
习题 4 8:更复杂的用户输入
异常的处理:在可能出现异常的地方用try和except进行测试。例如判断是否为数字的函数:

def convert_number(s):
    try:
        return int(s)
    except ValueError:
        return None

习题 4 9:创建句子
assert用法:
1、assert expression [,arguments],让程序测试这个expression 是否成立,如果为false或者为None,则raise一个AssertionError出来。arguments为自己编写,为assert断言添加异常说明,若expression不成立,则显示arguments,对该问题进行说明。
2、assert_equal(function(parameter),reference result).测试函数function的运行结果是否和预期的参考结果一致。
3、assert_raises(Error,function,parameter)方法可进行异常测试,参数包括:预期的异常、测试的函数,以及传递给测试函数的参数。如果被测试的函数有不止一个参数,把它们按顺序全部传递给 assert_raises,它会把这些参数传给被测的函数。 测试的函数并不是被调用,而是该函数的一个参数。 assert_raises(Error,function,parameter).相当于测试函数function(parameter)运行时是否会抛出Error这个错误。如果没有抛出Error,则测试不通过。
习题 5 0:你的第一个网站
1、浏览器通过网络连接到自己的电脑,他的名字叫localhost(不管它实际叫什么),使用的网络端口为5000.
2、连接成功以后,浏览器对bin/app.py这个应用程序发出了HTTP请求(request),要求访问URL :/,这通常是一个网站的第一个 URL。
3、在bin/app.py里,我们有一个表,里边包含了URL和类的匹配关系。我们这里只定义了一组匹配,那就是’/’, ‘index’的匹配。它的含义是:如果有人使用浏览器访问‘ /’这一级目录,lpthw.web将找到并加载class index,从而用它处理这个浏览器请求。
4、lpthw.web 找到了class index,然后针对这个类的一个实例调用了index.GET 这个方法函数。该函数运行后返回了一个字符串,以供 lpthw.web 将其传递给浏览器。
5、最后 lpthw.web 完成了对于浏览器请求的处理,将响应回传给浏览器
6、render调用的函数名称只要跟模板文件夹下的.html文件名匹配到,这个HTML模板就可以被用于渲染。
习题 5 1:从浏览器中获取输入
1、利用浏览器输入通过表单赋值
form = web.input(greet = "Welcome",name = "Nobody")
greeting = "%s, %s" % (form.greet, form.name)
浏览器输入:http://localhost:8080/hello?greet=Hola&name=Frank
2、也可以设置greet=None,然后对form.greet进行判断,如果有内容则正常显示,如果为空则返回设定的错误信息。
3、通过URL 参数实现表单提交不方便使用, “POST 表单”可以更好解决问题,这是一种包含了<form>标签的特殊HTML文件。这种表单收集用户输入并将其传递给你的web 程序。
4、<form action="/hello" method="POST">是hello_form.html里面最关键的一行,它告诉你的浏览器以下内容:
a. 从表单中的各个栏位收集用户输入的数据。 b. 让浏览器使用一种 POST 类型的请求,将这些数据发送给服务器。这是另外一种浏览器请求,它会将表单栏位“隐藏”起来。 c. 将这个请求发送至 /hello URL,这是由 action=”/hello” 告诉浏览器的。
这样填好表单后,浏览器依照<form>中的要求,将数据通过 POST 请求的方式发给 web 程序。Web 程序运行了 index.POST 方法(不是 index.GET 方法)来处理这个请求。
5、我们可以用<a>标签给网页添加超链接,例如:
<a href= http://localhost:8080/hello>链接的解释说明</a>
<!-- XXX -->格式为HTML语言做注释。
6、布局模板是一种提供了通用的头文件和脚注的外壳模板,可以用它将所有的其他网页包裹起来,减少重复动作。下面语句会告诉lpthw.web让它去使用templates/layout.html 作为其它模板的基础模板:
render = web.template.render('templates/', base="layout")
7、lpthw.web 有一个非常简单的 API :request用来处理web请求,帮助进行网页自动化测试,用法如下:app.request(localpart='/', method='GET', data=None, host='0.0.0.0:8080', headers=None, https=False),可以将URL 作为第一个参数,然后可以修改request 的方法、form 的数据、以及 header 的内容,这样无须启动web 服务器,就可以使用自动测试来测试web 程序。
习题 5 2:创建你的web游戏
1、在HTTP 协议的框架中,web 环境是“无状态(stateless)” 的。如果你请求了页面A,输入了一些数据,然后点了一个页面B 的链接,那你在页面A 输入的数据就会全部消失了。可以为 web 程序建立一个很小的web数据存储功能解决此问题,给每个浏览器进程赋予一个独一无二的数字,用来跟踪浏览器所作的事情。这个存储通常用数据库或者存储在磁盘上的文件来实现。例如:

app = web.application(urls, locals())
store = web.session.DiskStore('sessions')   
session = web.session.Session(app, store, initializer={'count': 0}) 

该语句将web信息存放在一个叫session的文件夹里,并为变量count设置了初始值0.
2、如果运行Python 代码引用自己写的其他包时看到了import错误,可以尝试在命令行运行下面语句来修改PYTHON的环境变量,进行修正:
Linux:export PYTHONPATH=$PYTHONPATH:.
windows:set PYTHONPATH=%PYTHONPATH%;.
PYTHONPATH是Python的搜索路径,默认我们import的模块都会从PYTHONPATH里面寻找.
3、web.seeother(“/XXXX”)跳转到其他页面
4、命令行脚本文件:当需要在终端连续执行一系列命令行命令时可以将他们全部写入一个空白文件中保存。然后用以下命令将该文件变成可读可写可执行文件:chmod 777 脚本名。最后在终端用以下命令运行该文件./脚本文件名,效果和在终端连续运行脚本中的一系列命令相同。
5、添加多个网页存储变量,用逗号分隔。比如:session=web.session.Session(app,store,initializer={'room':None,'action':None})。另外该变量还需要在初始的GET()函数中赋初值,才能被后续的其他函数使用。
6、HTML语言<p><pre>的区别<p>一般的格式,忽略多余的回车换行和Tab、空格;<pre>格式化文本,保留所有空格、回车和Tab
7、网页文本单行显示太长,可以加入如下语句使语句适应屏幕大小可以自动换行。但注意<pre>里的语句不受其影响。
<td style="word-break:break-all" ></td>
也可以用<p>标签参数实现自动换行功能。
<p style="white-space:pre-wrap"><p>
其中white-space的值:
normal 默认。空白会被浏览器忽略。
pre 空白会被浏览器保留。其行为方式类似 HTML 中的pre标签。
nowrap文本不会换行,文本会在在同一行上继续,直到遇到标签为止。
pre-wrap保留空白符序列,但是正常地进行换行。
pre-line合并空白符序列,但是保留换行符。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值