本章节中例子列表为: motorcycles = ['honda', 'yamaha', 'suzuki']
1.1从列表中删除元素
1.1.1按位置删除
- del语句
del motorcycles [x] #x为列表元素索引值
- pop()方法
popped_motorcycle = motorcycles.pop(x) #方法pop()可删除列表末尾的元素,并让你能够接着使用它。x仍为元素索引值
1.1.2按值删除
motorcycles.remove(value) #value为列表中的某个值
注:方法remove()只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
1.2列表排序
motorcycles.sort() #永久排序
如果你要按与字母顺序相反的顺序显示列表,可向函数sort()传递参数reverse=True。
sorted(motorcycles) #临时排序,也可传递参数reverse=True
motorcycles.reverse() #反转列表元素的排列顺序
len(motorcycles) #获取列表长度
1.3操作列表
1.3.1list()方法转换为列表
for value in range(1,5):
print(value) #打印1~4
list(range(1,6)) #转为列表
1.3.2列表解析
语法:
[expression for iter_val in iterable]
[expression for iter_val in iterable if cond_expr]
1.3.3切片
负数索引返回离列表末尾相应距离的元素,如 'suzuki'=motorcycles[-1]
1.3.4复制列表
list_copy=list[ : ] #这种方式会变成两个列表
list_copy=list #这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods中的列表,因此这两个变量都指向同一个列表。即操作任意一个,另一个也会被改。
1.3.5元组
元组是不可改的列表,使用()表示。
虽然不能修改元组的元素,但可以给存储元组的变量赋值。例如:
dimensions = (200, 50)
dimensions = (400, 100)
2if语句Python title() 方法返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写。
Python并不要求if-elif结构后面必须有else代码块。
if lista: #lista不为空返回True
3字典alien_0 = {'color': 'green', 'points': 5}
print(alien_0['color'])
alien_0['x_position'] = 0 #添加键—值对
注意:键—值对的排列顺序与添加顺序不同。Python不关心键—值对的添加顺序,而只关心键和值之间的关联关系。
alien_0['color'] = 'yellow' #修改键—值对
del alien_0['points'] #删除键—值对
3.1遍历字典
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
for key, value in user_0.items() #对于这两个变量,可使用任何名称。
注意,即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。
3.1.1遍历字典中的所有键
user_0 .keys()
遍历字典时,会默认遍历所有的键,因此,如果将for name in favorite_languages.keys():替换为for name in favorite_languages:,输出将不变。
3.1.2顺序遍历字典中的所有键
favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', } for name in sorted(favorite_languages.keys()): print(name.title() + ", thank you for taking the poll."
3.1.3遍历字典中的所有值
favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', } print("The following languages have been mentioned:") for language in favorite_languages.values(): print(language.title())
这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题,但如果被调查者很多,最终的列表可能包含大量的重复项。为剔除重复项,可使用集合(set)。集合类似于列表,但每个元素都必须是独一无二的:
favorite_languages = { 'jen': 'python', 'sarah': 'c', 'edward': 'ruby', 'phil': 'python', } print("The following languages have been mentioned:") for language in set(favorite_languages.values()): print(language.title()
3.2嵌套
字典列表、字典中存储列表、字典中存储字典
4while循环要立即退出while循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用break语句。
continue是忽略该语句后面的语句,返回到循环开头。
5函数5.1传递列表
将列表传递给函数后,函数就可对其进行修改。在函数中对这个列表所做的任何修改都是永久性的。
如果不想修改原列表,可向函数传递列表的副本,比如:function_name(list_name[:])
5.2传递任意数量的实参
def funciton(*toppings)
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。函数体内的print语句通过生成输出来证明Python能够处理使用一个值调用函数的情形,也能处理使用三个值来调用函数的情形。它以类似的方式处理不同的调用,注意,Python将实参封装到一个元组中,即便函数只收到一个值也如此。
注意:如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。
5.2.1使用任意数量的关键字实参
有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键—值对——调用语句提供了多少就接受多少。一个这样的示例是创建用户简介:你知道你将收到有关用户的信息,但不确定会是什么样的信息。在下面的示例中,函数build_profile()接受名和姓,同时还接受任意数量的关键字实参:
def build_profile(first, last, **user_info): """创建一个字典,其中包含我们知道的有关用户的一切""" profile = {} ❶ profile['first_name'] = first profile['last_name'] = last ❷for key, value in user_info.items(): profile[key] = value return profile user_profile = build_profile('albert', 'einstein',location='princeton',field='physics') print(user_profile)
函数build_profile()的定义要求提供名和姓,同时允许用户根据需要提供任意数量的名称—值对。形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称—值对都封装到这个字典中。在这个函数中,可以像访问其他字典那样访问user_info中的名称—值对。在build_profile()的函数体内,我们创建了一个名为profile的空字典,用于存储用户简介。在❶处,我们将名和姓加入到这个字典中,因为我们总是会从用户那里收到这两项信息。在❷处,我们遍历字典user_info中的键—值对,并将每个键—值对都加入到字典profile中。最后,我们将字典profile返回给函数调用行。
5.3将函数存储在模块中
5.3.1导入整个模块
要让函数是可导入的,得先创建模块。模块模块是扩展名为.py的文件,包含要导入到程序中的代码。
pizza.py
def make_pizza(size, *toppings): """概述要制作的比萨""" print("\nMaking a " + str(size) + "-inch pizza with the following toppings:") for topping in toppings: print("- " + topping)
making_pizzas.py
import pizza pizza.make_pizza(16, 'pepperoni') pizza.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
Python读取这个文件时,代码行import pizza让Python打开文件pizza.py,并将其中的所有函数都复制到这个程序中。你看不到复制的代码,因为这个程序运行时,Python在幕后复制这些代码。你只需知道,在making_pizzas.py中,可以使用pizza.py中定义的所有函数。
5.3.2导入特定的函数
你还可以导入模块中的特定函数,这种导入方法的语法如下:from module_name import function_name
通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:from module_name import function_0, function_1, function_2
from pizza import make_pizza make_pizza(16, 'pepperoni')
5.3.3使用as给函数指定别名给函数指定别名
下面给函数make_pizza()指定了别名mp()。这是在import语句中使用make_pizza as mp实现的,关键字as将函数重命名为你提供的别名:
from pizza import make_pizza as mp mp(16, 'pepperoni') mp(12, 'mushrooms', 'green peppers', 'extra cheese')
5.3.4使用as给模块指定别名给模块指定别名
import pizza as p p.make_pizza(16, 'pepperoni') p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
5.3.5导入模块中的所有函数
使用星号(*)运算符可让Python导入模块中的所有函数:
from pizza import * make_pizza(16, 'pepperoni') make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
import语句中的星号让Python将模块pizza中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。然而,使用并非自己编写的大型模块时,最好不要采用这种导入方法:如果模块中有函数的名称与你的项目中使用的名称相同,可能导致意想不到的结果:Python可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。最佳的做法是,要么只导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能让代码更清晰,更容易阅读和理解。