1列表

本章节中例子列表为: 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 pizzaPython打开文件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可能遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入所有的函数。最佳的做法是,要么只导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能让代码更清晰,更容易阅读和理解。