四、条件判断

每条 if 语句的核心都是一个值为 True 或 False 的表达式,这种表达式被称为条件测试。

  • 检查是否相等,用 ==
  • 检查是否不相等,用 !=
  • 数字比较 ><>=<=
  • 多个条件与 and
  • 多个条件或 or
  • 判断列表是否包含某元素 in
    >>> names
    ['aa', 'bb', 'cc', 'dd', 'ee']
    >>> 'bb' in names
    True
    
  • 判断列表是否不包含某元素
    >>> names
    ['aa', 'bb', 'cc', 'dd', 'ee']
    >>> 'ff' not in names
    True
    

if 语句

简单的 if-else

>>> a = 10
>>> if a > 10:
...     print('hello')
... else:
...     print('bye')
...
bye

if-elif-else

>>> if a<5:
...     print(a<5)
... elif 5<a<10:
...     print('5<a<10')
... else:
...     print('a>10')
...
a>10

五、字典

在Python中,字典是一系列键-值对。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象用作字典中的值。

(1)字典的增删改查

使用字典

在Python中,字典用放在花括号{}中的一系列键-值对表示。

>>> user = {'name':'bob', 'sex':'male', 'age':20}
>>> user
{'name': 'bob', 'sex': 'male', 'age': 20}
访问字典中的值

要获取与键相关联的值,可依次指定字典名和放在方括号内的键。

>>> user
{'name': 'bob', 'sex': 'male', 'age': 20}
>>> user['name']
'bob'
>>> user['age']
20
添加键值对

字典是一种动态结构,可随时在其中添加键—值对。

>>> user['city']='beijing'
>>> user
{'name': 'bob', 'sex': 'male', 'age': 20, 'city': 'beijing'}
修改字典中的值

要修改字典中的值,可依次指定字典名、用方括号括起的键以及与该键相关联的新值。

>>> cat = {}
>>> cat['color'] = 'white'
>>> cat['age'] = 4
>>> cat
{'color': 'white', 'age': 4}
>>> cat['age'] = 6
>>> cat
{'color': 'white', 'age': 6}
删除键值对

对于字典中不再需要的信息,可使用del语句将相应的键—值对彻底删除。使用del语句时,必须指定字典名和要删除的键。

>>> del cat['color']
>>> cat
{'age': 6}

(2)遍历字典

字典可用于以各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键—值对、键或值。

遍历所有键值对 items()
>>> cat
{'age': 6, 'color': 'white', 'city': 'beijing'}
>>> for k,v in cat.items():
...     print(k + '-' + str(v))
...
age-6
color-white
city-beijing

通过 for k,v in cat.items() 的方式遍历所有的键值对,k 代表键,v 代表值。

注意:即便遍历字典时,键—值对的返回顺序也与存储顺序不同。Python不关心键—值对的存储顺序,而只跟踪键和值之间的关联关系。

遍历所有键 keys()

如果不需要用值,可以用 keys() 遍历出所有的键。

>>> cat
{'age': 6, 'color': 'white', 'city': 'beijing'}
>>> for k in cat.keys():
...     print(k.title())
...
Age
Color
City

上面的例子打印出了 cat 的所有键,用字符串的 title() 方法使每个单词的首字母大写。

遍历字典时会默认遍历所有的键,for k in cat.keys()for k in cat 的效果一样。

按顺序遍历所有键,可用 sorted() 排序,这让Python列出字典中的所有键,并在遍历前对这个列表进行排序。

>>> for k in sorted(cat.keys()):
...     print(k.title())
...
Age
City
Color
遍历所有值 values()
>>> for value in cat.values():
...     print(str(value))
...
6
white
beijing

如果需要剔除重复项,可以使用 set()

>>> cat
{'age': 6, 'color': 'white', 'city': 'beijing', 'city2': 'beijing'}
>>> for value in cat.values():
...     print(str(value))
...
6
white
beijing
beijing
>>> for value in set(cat.values()):
...     print(str(value))
...
beijing
white
6

(3)嵌套

可以在列表中嵌套字典、在字典中嵌套列表以及在字典中嵌套字典。这里就不演示了。

六、用户输入和 while 循环

(1)用户输入

函数 input() 让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其存储在一个变量中,以方便你使用。

>>> msg = input('Please input your name: ')
Please input your name: solo
>>> msg
'solo'

如果你使用的是 Python 2.7,应使用函数 raw_input() 来提示用户输入。这个函数与 Python 3 中的 input() 一样,也将输入解读为字符串。

Python 2.7 也包含函数 input(),但它将用户输入解读为Python代码,并尝试运行它们。如果你使用的是Python 2.7,请使用raw_input()而不是input()来获取输入。

如果想将输入的内容转换为数字,可以用 int() 来转换。

(2)while 循环

for 循环用于针对集合中的每个元素都一个代码块,而while循环不断地运行,直到指定的条件不满足为止。

>>> num = 1
>>> while num <= 5:
...     print(str(num))
...     num += 1
...
1
2
3
4
5
break

要立即退出while循环,不再运行循环中余下的代码,也不管条件测试的结果如何,可使用break语句。break语句用于控制程序流程,可使用它来控制哪些代码行将执行,哪些代码行不执行,从而让程序按你的要求执行你要执行的代码。

continue

要返回到循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句,它不像 break 语句那样不再执行余下的代码并退出整个循环。

七、函数

Python 用关键字 def 来定义函数,函数名以冒号 : 结尾,冒号之后的缩进里的内容都是函数体。

>>> def greet():
...     print('Hello World!')
...
>>> greet()
Hello World!

(1)函数参数

可以向函数传递参数。下面的例子向函数 greet() 传递了个参数 name。其中 name 是形参,solo 是实参。

>>> def greet(name):
...     print('Hello,' + name)
...
>>> greet('solo')
Hello,solo

向函数传递实参的方式很多,可使用位置实参,这要求实参的顺序与形参的顺序相同;也可使用关键字实参,其 中每个实参都由变量名和值组成;还可使用列表和字典。

位置实参

你调用函数时,Python 必须将函数调用中的每个实参都关联到函数定义中的一个形参。为此,最简单的关联方式是基于实参的顺序。这种关联方式被称为位置实参。

>>> def student(name, age):
...     print('Hello, My name is ' + name + ', I am ' + str(age) + ' years old')
...
>>> student('solo', 18)
Hello, My name is solo, I am 18 years old

按照形参定义的顺序传递的实参就称为位置实参。

关键字实参

关键字实参是传递给函数的名称—值对。关键字实参让你无需考虑函数调用中的实参顺序,还清楚地指出了函数调用中各个值的用途。

>>> student(age=18, name='solo')
Hello, My name is solo, I am 18 years old

接着位置实参中的例子,student(name, age) 方法第一个参数是 name,第二个参数是 age 。我们用关键字实参指明传递的是哪一个,即使顺序写乱了得到的结果也不会乱。

默认值

编写函数时,可给每个形参指定默认值。在调用函数中给形参提供了实参时,Python 将使用指定的实参值;否则,将使用形参的默认值。因此,给形参指定默认值后,可在函数调用中省略相应的实参。使用默认值可简化函数调用,还可清楚地指出函数的典型用法。

>>> def student(name, age=18):
...     print('Hello, My name is ' + name + ', I am ' + str(age) + ' years old')
...
>>> student('bob')
Hello, My name is bob, I am 18 years old
>>> student('nicole')
Hello, My name is nicole, I am 18 years old
>>> student('bob', 20)
Hello, My name is bob, I am 20 years old

如上,给 student() 函数定义的第二个参数 age 设置了默认值 18,如果调用时只传一个参数,无论传的是什么 age 都是 18。当传两个参数时,传递的实参就会覆盖掉默认值。

注意:使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的实参。这让Python依然能够正确地解读位置实参。

(2)返回值

函数并非总是直接显示输出,相反,它可以处理一些数据,并返回一个或一组值。函数返回 的值被称为返回值。在函数中,可使用return语句将值返回到调用函数的代码行。返回值让你能够将程序的大部分繁重工作移到函数中去完成,从而简化主程序。

>>> def student(name):
...     return name
...
>>> name = student('solo')
>>> name
'solo'
返回字典

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。例如,下面的函数接受姓名和年龄,并返回一个表示人的字典:

>>> def build_person(name,age):
...     person = {'name':name, 'age':age}
...     return person
...
>>> p = build_person('solo',18)
>>> p
{'name': 'solo', 'age': 18}

(3)传递任意数量的实参

有时候,你预先不知道函数需要接受多少个实参,好在Python允许函数从调用语句中收集任意数量的实参。

>>> def person(*args):
...     print(args)
...
>>> person('name','age','address')
('name', 'age', 'address')

上面定义了一个函数 person() ,只有一个形参 *args 。形参名 *args 中的星号让 Python 创建一个名为 args 的空元组,并将收到的所有值都封装到这个元组中。

结合使用位置实参和任意数量实参

如果要让函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。Python 先匹配位置实参和关键字实参,再将余下的实参都收集到最后一个形参中。

>>> def person(city, *args):
...     print('city: ' + city + ', other args:')
...     for value in args:
...             print(value)
...
>>> person('beijing', 'name', 'age', 'tel')
city: beijing, other args:
name
age
tel

函数 person() 有两个形参,第一个 city 是普通的位置实参,第二个 *args 是可变参数。

使用任意数量的关键字实参

有时候,需要接受任意数量的实参,但预先不知道传递给函数的会是什么样的信息。在这种情况下,可将函数编写成能够接受任意数量的键—值对——调用语句提供了多少就接受多少。一个这样的示例是创建用户简介:你知道你将收到有关用户的信息,但不确定会是什么样的信息。

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 = build_profile('steven', 'bob', city='beijing', age=18)

print(user)

执行代码,输出结果是:

{'first_name': 'steven', 'last_name': 'bob', 'city': 'beijing', 'age': 18}

(4)导入导出

可以将函数存储在被称为模块的独立文件中,再将模块导入到主程序中。import语句允许在当前运行的程序文件中使用模块中的代码。

导入整个模块

模块是扩展名为.py的文件,包含要导入到程序中的代码。

cat.py

def eat(food):
    print('I am cat, I eat ' + food)

animal.py

import cat
cat.eat('fish')

控制台输出

I am cat, I eat fish
导入特定的函数

你还可以导入模块中的特定函数,这种导入方法的语法如下:

from module_name import function_name 

通过用逗号分隔函数名,可根据需要从模块中导入任意数量的函数:

from module_name import function_0, function_1, function_2 

上面的例子只导入 cat.py 中的 eat() 方法

from cat import eat
eat('fish')

得到相同的结果。

使用 as 给函数指定别名

如果要导入的函数的名称可能与程序中现有的名称冲突,或者函数的名称太长,可指定简短而独一无二的别名——函数的另一个名称,类似于外号。要给函数指定这种特殊外号,需要在导入它时这样做。

from cat import eat as cat_eat
cat_eat('fish')

cat.py 中的 eat() 方法导入并指定了别名 cat_eat,使用时可以直接用别名使用。

使用 as 给模块指定别名

你还可以给模块指定别名。通过给模块指定简短的别名,让你 能够更轻松地调用模块中的函数。

通用语法:import module_name as mn

import cat as c
c.eat('fish')
导入模块中的所有函数

使用星号(*)运算符可让Python导入模块中的所有函数:

cat.py

def eat(food):
    print('I am cat, I eat ' + food)

def run():
    print('cat run')

animal.py

from cat import *

eat('fish')
run()

输出结果

I am cat, I eat fish
cat run

由于导入 了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。然而,使用并非自己编写的 大型模块时,最好不要采用这种导入方法::如果模块中有函数的名称与你的项目中使用的名称相 同,可能导致意想不到的结果: Python 可能遇到多个名称相同的函数或变量,进而覆盖函数,而 不是分别导入所有的函数。

最佳的做法是,要么只导入你需要使用的函数,要么导入整个模块并使用句点表示法。这能 让代码更清晰,更容易阅读和理解。

(5)函数编写指南

  • 应给函数指定描述性名称

  • 函数名应只包含小写字母和下划线

  • 每个函数都应包含简要地阐述其功能的注释,该注释应紧跟在函数定义后面,并采用文档字符串格式。

  • 给形参指定默认值时,等号两边不要有空格:

    def function_name(parameter_0, parameter_1='default value')
    

    对于函数调用中的关键字实参,也应遵循这种约定:

    function_name(value_0, parameter_1='value')
    
  • 如果程序或模块包含多个函数,可使用两个空行将相邻的函数分开,这样将更容易知道前一个函数在什么地方结束,下一个函数从什么地方开始。

  • 所有的 import 语句都应放在文件开头,唯一例外的情形是,在文件开头使用了注释来描述整个程序。

八、类

(1)创建和使用类

class Cat():
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def eat(self):
        print('cat ' + self.name + ' color ' + self.color + ', now eat')

    def run(self):
        print('cat ' + self.name + ' color ' + self.color + ', now run')

my_cat = Cat('Spring', 'white')
print(my_cat.name)
print(my_cat.color)
my_cat.eat()
my_cat.run()

上面创建了类 Cat ,并实例化了 my_cat,然后调用了类的方法 eat()run()。输出结果:

Spring
white
cat Spring color white, now eat
cat Spring color white, now run

类中的函数称为方法。__init__() 是函数的构造方法,每档创建新实例时 Python 都会自动运行它。注意构造方法名字必须是这个,是规定好的。

上面的例子中__init__(self, name, color) 有三个形参,第一个形参 self 必不可少,还必须位于其他形参的前面。其他的形参可以根据需要调整。self 是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

还可以通过实例直接访问属性:my_cat.name。但在其他语言中并不建议这样做。

在 Python 2.7 中创建类

在 Python 2.7 中创建类时,需要做细微的修改——在括号内包含单词object:

class ClassName(object):

(2)类的属性

给属性设置默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法 __init__() 内指定这种初始值是可行的;如果你对某个属性这样做了,就无需包含为它提供初始值的形参。

重新定义 Cat ,在构造方法中给属性 age 设置默认值。

class Cat():
    def __init__(self, name, color):
        self.name = name
        self.color = color
        self.age = 3

    def eat(self):
        print('cat ' + self.name + ' color ' + self.color + ', now eat')

    def run(self):
        print('cat ' + self.name + ' color ' + self.color + ', now run')

    def print_age(self):
        print('cat`s age is ' + str(self.age))
修改属性的值

可以以三种不同的方式修改属性的值:直接通过实例进行修改,通过方法进行设置。

1. 直接修改属性的值

要修改属性的值,最简单的方式是通过实例直接访问它。

class Cat():
    def __init__(self, name, color):
        self.name = name
        self.color = color
        self.age = 3

    def eat(self):
        print('cat ' + self.name + ' color ' + self.color + ', now eat')

    def run(self):
        print('cat ' + self.name + ' color ' + self.color + ', now run')

    def print_age(self):
        print('cat`s age is ' + str(self.age))

my_cat = Cat('Spring', 'white')

my_cat.print_age()
my_cat.age = 4
my_cat.print_age()

输出结果为

cat`s age is 3
cat`s age is 4

上例直接通过 my_cat.age = 4 修改了 age 属性的值。

2. 通过方法修改属性的值

再来更新代码,加入 update_age() 方法来修改 age 的属性。

class Cat():
    def __init__(self, name, color):
        self.name = name
        self.color = color
        self.age = 3

    def eat(self):
        print('cat ' + self.name + ' color ' + self.color + ', now eat')

    def run(self):
        print('cat ' + self.name + ' color ' + self.color + ', now run')

    def print_age(self):
        print('cat`s age is ' + str(self.age))

    def update_age(self, age):
        self.age = age

my_cat = Cat('Spring', 'white')
my_cat.print_age()
my_cat.update_age(10)
my_cat.print_age()

运行代码输出:

cat`s age is 3
cat`s age is 10

(3)继承

一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

class Animal():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def run(self):
        print('Animal ' + self.name + ' run')

class Cat(Animal):
    def __init__(self, name, age):
        super().__init__(name, age)

cat = Cat('Tony', 2)
cat.run()

运行程序,输出:

Animal Tony run

先定义了类 Animal,又定义了 Cat 继承自 AnimalAnimal称为父类, Cat 称为子类。通过输出可以验证,子类继承了父类的方法。

在子类的构造方法中要先实现父类的构造方法:super().__init__(name, age)

还可以给子类定义自己的方法,或者重写父类的方法。

class Animal():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def run(self):
        print('Animal ' + self.name + ' run')

class Cat(Animal):
    def __init__(self, name, age):
        super().__init__(name, age)

    def play(self):
        print('Cat ' + self.name + ' play')

    def run(self):
        print('Cat ' + self.name + ' run')

cat = Cat('Tony', 2)
cat.run()
cat.play()

我们来修改下程序,Animal 类不变,Cat 类还是继承了 Animal ,但定义了自己的方法 play() 并重写了父类方法 run() 。运行程序,得到输出:

Cat Tony run
Cat Tony play
Python2.7 中的继承

在 Python 2.7 中,继承语法稍有不同,ElectricCar 类的定义类似于下面这样:

class Car(object):
	def __init__(self, make, model, year):
    	--snip--

class ElectricCar(Car):
	def __init__(self, make, model, year):
		super(ElectricCar, self).__init__(make, model, year)
		--snip--

函数 super() 需要两个实参:子类名和对象self。为帮助Python将父类和子类关联起来,这些实参必不可少。另外,在Python 2.7中使用继承时,务必在定义父类时在括号内指定object。

(4)导入类

当一个文件过长时,可以将其中一部分代码抽离出去,然后导入到主文件中。

导入方式有多种:

  • 导入单个类 假如 car.py 里定义了类 Car

    from car import Car
    
  • 从一个模块中导入多个类 假如 car.py 包含了三个类 CarBatteryElectricCar 。 只导入一个类:

    from car import ElectricCar
    

    导入多个类,中间用逗号隔开:

    from car import Car, ElectricCar
    
  • 导入整个模块 还可以导入整个模块,再使用句点表示法访问需要的类。这种导入方法很简单,代码也易于阅读。由于创建类实例的代码都包含模块名,因此不会与当前文件使用的任何名称发生冲突。

    import car
    my_car = car.Car()
    
  • 导入模块中的所有类 要导入模块中的每个类,可使用下面的语法:

    from module_name import *
    

不推荐使用这种导入方式,其原因有二。

首先,如果只要看一下文件开头的 import 语句,就能清楚地知道程序使用了哪些类,将大有裨益;但这种导入方式没有明确地指出你使用了模块中 的哪些类。这种导入方式还可能引发名称方面的困惑。如果你不小心导入了一个与程序文件中其 他东西同名的类,将引发难以诊断的错误。这里之所以介绍这种导入方式,是因为虽然不推荐使 用这种方式,但你可能会在别人编写的代码中见到它。

需要从一个模块中导入很多类时,最好导入整个模块,并使用 module_name.class_name 语法 来访问类。这样做时,虽然文件开头并没有列出用到的所有类,但你清楚地知道在程序的哪些地 方使用了导入的模块;你还避免了导入模块中的每个类可能引发的名称冲突。

九、文件和异常

(1)从文件中读取数据

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

读取整个文件
with open('test.txt') as file_obj:
    contents = file_obj.read()
    print(contents)

open() 用于打开一个文件,参数为文件的路径。

关键字 with 在不再需要访问文件后将其关闭。有了 with 你只管打开文件,并在需要时使用它,Python自会 在合适的时候自动将其关闭。

相比于原始文件,该输出唯一不同的地方是末尾多了一个空行。为何会多出这个空行呢?因为 read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print语句中使用 rstrip()

文件路径可以是相对路径,也可以是绝对路径。

逐行读取
with open('test.txt') as file_obj:
    for line in file_obj:
        print(line.rstrip())

要以每次一行的方式检查文件,可对文件对象使用for循环。

(2)写入文件

with open('test.txt', 'w') as file_obj:
    file_obj.write("I love python")

在这个示例中,调用 open() 时提供了两个实参,第一个实参也是要打开的文件的名称;第二个实参('w')告诉Python,我们要以写入模式打开这个文件。

可选模式:

  • r :只读。
  • w : 只写。如果文件不存在则创建,如果文件存在则先清空,再写入。
  • a :附加模式,写入的内容追加到原始文件后面。如果文件不存在则创建。
  • r+ :可读可写。

如果你省略了模式实参,Python 将以默认的只读模式打开文件。

(3)异常

异常是使用try-except代码块处理的。try-except代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。

try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")
else 代码块
try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")
else:
	print("no exception")

如果 try 中的代码运行成功,没有出现异常,则执行 else 代码块中的代码。

(4)用 json 存储数据

Python 中使用 json.dump()json.load() 来存储和读取 json 文件。

import json

userInfo = {'username': 'jack', 'age': 18}

with open('test.txt', 'w') as obj:
    json.dump(userInfo, obj)

with open('test.txt') as obj:
    content = json.load(obj)
    print(content)

上例中用 json.dump() 把数据存入到了 test.txt 中,又用 json.load() 把数据从文件中取出并打印。

注意使用前先导入 json 模块。

Python 资料分享

Python 学习路线图:

《Python编程:从入门到实践》内容分为基础篇和实战篇两部分,基础篇介绍基本的编程概念,并指导小白编写简洁且易于理解的代码。实战篇介绍如何利用新学到的知识开发功能丰富的项目:外星人入侵、数据可视化、Web应用程序。

第一部分:基础知识
  • 起步(安装,搭建编程环境)
  • 变量和简单数据类型
  • 列表简介
  • 操作列表
  • if 语句

  • 字典
  • 用户输入和while循环
  • 函数
  • 文件和异常
  • 测试代码

第二部分:项目
  • 武装飞船
  • 外星人
  • 记分

以上资料免费分享,想要入门Python ,或者正在学习 Python 的朋友都可以【点击此处免费领取 Python 学习资料!