>>>name.py
>>>name = "ada lovelace" print(name.title())
Ada Lovelace
>>>name = "Ada Lovelace" print(name.upper()) print(name.lower())
ADA LOVELACE ada lovelace
存储数据时,方法lower()很有用。很多时候,你无法依靠用户来提供正确的大小写,因此 需要将字符串先转换为小写,再存储它们。以后需要显示这些信息时,再将其转换为最合适的大小写方式。
字符串就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号, 也可以是双引号, 这种灵活性让你能够在字符串中包含引号和撇号
'I told my friend, "Python is my favorite language!"'
"The language 'Python' is named after Monty Python, not the snake."
"One of Python's strengths is its diverse and supportive community."
习惯“”+str(x)+""——你可以使用拼接来创建消息,再把整条消息都存储在一个变量中:
first_name = "ada" last_name = "lovelace"
full_name = first_name + " " + last_name
message = "Hello, " + full_name.title() + "!" print(message)
上述代码也显示消息“Hello, Ada Lovelace!”,但将这条消息存储在了一个变量中, 这让最后的print语句简单得多
还可在同一个字符串中同时包含制表符和换行符。字符串"\n\t"让Python换到下一行,并在 下一行开头添加一个制表符。
>>>name="sub mit"
>>>print(name.lower()+"\n\t"+name.upper())
sub mit
SUB MIT
你将使用为数不多的几行代码来生成很多行输出,届时制表符和换行符 将提供极大的帮助。
在程序中,额外的空白可能令人迷惑。对程序员来说,'python'和'python '看起来几乎没 什么两样,但对程序来说,它们却是两个不同的字符串。Python能够发现'python '中额外的空白,并认为它是有意义的——除非你告诉它不是这样的。
Python能够找出字符串开头和末尾多余的空白。要确保字符串末尾没有空白,可使用方法 rstrip()。
>>> favorite_language = 'python '
>>> favorite_language.rstrip()
'python'
>>> favorite_language
'python '
要永久删除这个字符串中的空白,必须将删除操作的结果存回到变量中:
>>> favorite_language = 'python '
>>> favorite_language = favorite_language.rstrip()
>>> favorite_language
'python'
你还可以剔除字符串开头的空白,或同时剔除字符串两端的空白。为此,可分别使用方法 lstrip()和strip():
>>> favorite_language = ' python '
>>> favorite_language.rstrip()
' python'
>>> favorite_language.lstrip()
'python '
>>> favorite_language.strip()
'python'
可调用函数str(),它让Python将非字符串值表示为字符串:
age = 23 message = "Happy " + str(age) + "rd Birthday!"
print(message)
str函数同样可以把小数转为字符串
列表:arr=[2,5,"er"]
>>>arr[2]
er
>>>arr[-1]
er
这种语法很有用,因为你经常需要在不知道列表长度的情况下访问最后的元素
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.append('ducati')
motorcycles.insert(0, 'ducati')
del motorcycles[0]
last_owned = motorcycles.pop()
first_owned = motorcycles.pop(0)
popped_motorcycle = motorcycles.pop()
motorcycles.remove('ducati')
方法append()将元素'ducati'添加到了列表末尾
方法insert()将元素'ducati'添加到了列表指定位置
方法del将元素下标为0的删除掉了
方法pop()可删除列表末尾的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类 比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。
你可以使用pop()来删除列表中任何位置的元素,只需在括号中指定要删除的元素 的索引即可。
如果你不确定该使用del语句还是pop()方法,下面是一个简单的判断标准:如果你要从列表 中删除一个元素,且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续 使用它,就使用方法pop()。
如果你只知道要删除的元素的值,可使用方法remove()。
方法remove()只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要 使用循环来判断是否删除了所有这样的值。
如果删除的值不存在,会报错
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()
cars.sort(reverse=True)
print(sorted(cars))
方法sort()永久性地修改了列表元素的排列顺序。现在,汽车是按字母顺序排列的, 再也无法恢复到原来的排列顺序
你还可以按与字母顺序相反的顺序排列列表元素,只需向sort()方法传递参数 reverse=True。(留意python里,truefalse,都是首字母大写)
not supported between instances of 'int' and 'str'::不支持int和str格式同时存在的时候进行排序
要保留列表元素原来的排列顺序,同时以特定的顺序呈现它们,可使用函数sorted()。函数 sorted()让你能够按特定顺序显示列表元素,同时不影响它们在列表中的原始排列顺序(当然也可以使用reverse=True,如:sorted(cars,reverse=True))。 (留意sort()是列表调用的方法,直接改变列表的值,而sorted()则是把列表作为参数,以返回值为列表的方式来达成目标)
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.reverse()
reverse()不是指按与字母顺序相反的顺序排列列表元素,而只是反转列表元素的排列顺序
方法reverse()永久性地修改列表元素的排列顺序,但可随时恢复到原来的排列顺序,为此 只需对列表再次调用reverse()即可。
len(cars)
使用函数len()可快速获悉列表的长度
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
使用for循环来打印魔术师名单中的所有名字
像下面这样编写for循环的第一行代码是不错的选择: (列表名字加"s",列表元素去"s")
for cat in cats:
for dog in dogs:
for item in list_of_items:
(留意,每个输出语句自带回车,也就是换行,这一点和java,println();很像)
(其中,不要在不需要缩进的行进行代码缩进,这样会导致程序报错)
for value in range(1,5):
print(value)
range()只是打印数字1~4,这是你在编程语言中经常看到的差一行为的结果。 函数range()让Python从你指定的第一个值开始数,并在到达你指定的第二个值后停止,因此输出 不包含第二个值(这里为5)
numbers = list(range(1,6))
print(numbers)
[1, 2, 3, 4, 5]
even_numbers = list(range(2,11,2))
print(even_numbers)
[2, 4, 6, 8, 10]
这里留意,书中有一个模糊的地方:
for names in range(0,6,2):
print(names)
运行以上程序不会输出6,但是书中有这样一行话:
在这个示例中,函数range()从2开始数,然后不断地加2,直到达到或超过终值(11)
有几个专门用于处理数字列表的Python函数。例如,你可以轻松地找出数字列表的最大值、 最小值和总和:
>>> digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
>>> min(digits)
0
>>>
max(digits)
9
>>> sum(digits)
45
squares = [value**2 for value in range(1,11)]
print(squares)
首先指定一个描述性的列表名,如squares;然后,指定一个左方括号, 并定义一个表达式,用于生成你要存储到列表中的值。在这个示例中,表达式为value**2,它计 算平方值。接下来,编写一个for循环,用于给表达式提供值,再加上右方括号。在这个示例中,for循环为for value in range(1,11),它将值1~10提供给表达式value**2。请注意,这里的for 语句末尾没有冒号。
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[1:4])
['martina', 'michael', 'florence']
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[:4])
['charles', 'martina', 'michael', 'florence']
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[-3:])
['martina', 'michael', 'florence']
可以和for遍历连用:
for player in players[:3]:
print(player.title())
可以复制列表到另一列表:
friend_foods = my_foods[:]
其中,需留意:如果friend_foods = my_foods,则他们并不相互独立,my_foods加入元素后,friend_foods也会有该值,这仅仅复制了地址,而非完全复制了内容
dimensions = (200, 50)
假使修改元组值会报错::'tuple' object does not support item assignment ::元组内的元素不能被改变
留意:元组无法切面,元组可以存放不同类型的值,元组可以被for遍历,元组不支持tp1+tp2运算,但列表可以
在程序中混合使用制表符和空格可能导致极难解决的问题。如果你混合使用了制表符和空 格,可将文件中所有的制表符转换为空格,大多数编辑器都提供了这样的功能。
if语句,判断字符串时大小写敏感
其中,if里本来使用的&&和||在python里是and和or
elif在python里就是else if的意思
if list:--这里的llist列表或是元组为空则返回False值,否则为True
alien_0 = {'color': 'green', 'points': 5}
print(alien_0['color'])
print(alien_0['points'])
green
5
在Python中,每个键都与一个值相关联,与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对 象用作字典中的值。
alien_0 = {}
alien_0['color'] = 'green'
alien_0['points'] = 5
有时候,在空字典中添加键—值对是为了方便,而有时候必须这样做。为此,可先使用一对空的花括号定义一个字典,再分行添加各个键—值对。
留意,字典里的键也需要用引号引上,而不是如同列表一样
留意,字典创建时,最后的一个元素后也可以打上逗号
alien_0 = {'color': 'green', 'points': 5}
del alien_0['points']
对于字典中不再需要的信息,可使用del语句将相应的键—值对彻底删除。使用del语句时, 必须指定字典名和要删除的键。
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
确定需要使用多行来定义字典时,在输入左花括号后按回车 键,再在下一行缩进四个空格,指定第一个键—值对,并在它后面加上一个逗号。此后你再次按 回车键时,文本编辑器将自动缩进后续键—值对,且缩进量与第一个键—值对相同。
print("Sarah's favorite language is " +
favorite_languages['sarah'].title() +
".")
单词print比大多数字典名都短,因此让输出的第一部分紧跟在左括号后面是合理的。请选择在合适的地方拆分要打印的内容,并在第一行末尾加上一个拼接运算符(+)。按回车键进入print语句的后续各行,并使用Tab键将它们对齐并缩进一级。指定要打印的所有内容后,在print语句的后一行末尾加上右括号
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
for key, value in user_0.items():
print("\nKey: " + key)
print("Value: " + value)
字典的遍历需要两个变量接值,字典名后需接items()方法
注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
for name in favorite_languages.keys():
print(name.title())
在不需要使用字典中的值时,方法keys()很有用。下面来遍历字典favorite_languages,并将每个被调查者的名字都打印出来:,而即使是favorite_languages,不使用keys()方法也可以达到同样的效果,不过keys()增加了代码的可读性
与之相同,values()方法也同样可行
for name in sorted(favorite_languages.keys()):
print(name.title() + ", thank you for taking the poll.")
要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此,可使用函数sorted()来获得按特定顺序排列的键列表的副本。
留意,此方法并不适用于values()输出、
for language in set(favorite_languages.values()):
print(language.title())
但可以使用set()方法对values值进行去重
aliens=[]
for i in range (0,30):
new_alien={'color' : 'green','point' : 5,'speed' : 'slow'}
aliens.append(new_alien)
for alien in aliens[0:3]:
if(alien['color']=='green'):
alien['color'] = 'yellow'
alien['point'] = 10
alien['speed'] = 'medium'
联合起来就成了这样
age = input("How old are you? ")
输入
age = int(age)
而输入不能直接让python视为int类型,使用需要在接受输入一行对数值进行强转
while current_number <= 5:
和其他语言一样,仅仅依旧把括号去掉了,加上了冒号
while unconfirmed_users:
当列表不为空则为True否则为False
while 'cat' in pets:
pets.remove('cat')
用此方法删除列表里所有的特定元素
由于while很多语法方法都和C语言java大同小异,就不做阐述了。
def greet_user(username):
"""显示简单的问候语"""
print("Hello, " + username.title() + "!")
greet_user('jesse')
和javaC语言差不多
def describe_pet(animal_type, pet_name=‘xiaoming’):
"""显示宠物的信息"""
print("\nI have a " + animal_type + ".")
print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet(animal_type='hamster', pet_name='harry')
可以在使用函数的时候,可以直接以赋值的方式,避免参数的传错位
可以在函数定义的时候,给形参赋默认值
import pizza as p
可以简化要导入模块的名称,以p替换pizza
from pizza import *
导入该模块的所有函数(但是这个有函数重名的风险)
这个就如同java的构造函数一样,在函数被调用时自动运行
self即this,和java不同点在于需要在方法的参数括号里写上self
继承则和java一样,不过语法为,class P2(P1),为p2继承p1
重写也和java一样
with open('text_files/ filename .txt') as file_object:
contents = file_object.read()
print(contents)
关键字with在不再需要访问文件后将其关闭。
函数open()接受一个参数: 要打开的文件的名称。
你还可以将文件在计算机中的准确位置告诉Python,这样就不用关心当前运行的程序存储在 什么地方了。这称为绝对文件路径。在相对路径行不通时,可使用绝对路径。
在文件中,每行的末尾都有一个看不见的换行符,而 print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句。要消除这些多余的空白行,可在print语句中使用rstrip()
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
或
filename = 'pi_digits.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
逐行读取
其中,lines类型为列表
...
小插曲:
if str1 in str2
可判断str2字符串是否包含str1
...
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
调用open()时提供了两个实参。第一个实参也是要打开的文件的名称; 第二个实参('w')告诉Python,我们要以写入模式打开这个文件。打开文件时,可指定读取模 式('r')、写入模式('w')、附加模式('a')或让你能够读取和写入文件的模式('r+')。如果 你省略了模式实参,Python将以默认的只读模式打开文件。 如果你要写入的文件不存在,函数open()将自动创建它。然而,以写入('w')模式打开文 件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件,而(‘a’)则是添加内容,不会擅长原有内容
函数write()不会在你写入的文本末尾添加换行符,因此,你需要自己添加“\n”来添加回车
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print("ok!")
和java抛异常一样,其中,ZeroDivisionError为该异常的名称,依赖于try代码块成功执行的代码都应放到else代码块中:
程序崩溃可不好,但让用户看到traceback也不是好主意。不懂技术的用户会被它们搞糊涂, 而且如果用户怀有恶意,他会通过traceback获悉你不希望他知道的信息。例如,他将知道你的程 序文件的名称,还将看到部分不能正确运行的代码。有时候,训练有素的攻击者可根据这些信息 判断出可对你的代码发起什么样的攻击
filename = 'alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
异常处理的样例
...
小插曲
>>> title = "Alice in Wonderland"
>>> title.split()
['Alice', 'in', 'Wonderland']
方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。 和java一样
...
Python有一个pass语句,可在代码块中使用它来让Python什么都不要做:
import json
username = input("What is your name? ")
filename = 'username.json'
with open(filename, 'w') as f_obj
: json.dump(username, f_obj)
print("We'll remember you when you come back, " + username + "!")
import json
filename = 'username.json'
with open(filename) as f_obj:
username = json.load(f_obj)
print("Welcome back, " + username + "!")
json将数据处理成可以保持到内存里的数据,dump为把数据封装成可以保存的数据,load则为加载被保存的数据。
import unittest from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_first_last_name(self):
"""能够正确地处理像Janis Joplin这样的姓名吗?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
其中
assertEqual(a, b) 核实a == b
assertNotEqual(a, b) 核实a != b
assertTrue(x) 核实x为True
assertFalse(x) 核实x为False
assertIn( item , list ) 核实 item 在 list 中
assertNotIn( item , list ) 核实 item 不在 list 中
测试方法目前没有发现比较厉害的内容,也对测试本身不甚了解,以后继续钻研
待续