在python中有一个值称为None,它表示没有值,就像bool值True 和 False一样,None的首字母 N必须大写。print()函数的返回值就是None。
spam=print('Hello')
None==spam##输出True
对于所有没有return语句的函数定义,Python 都会在末尾加上 return None
,而且使用不带值的Return 语句(也就是return 关键字本身),也返回None。
python函数可以返回多个值
def divid(a,b):
shang=a//b
yushu=a%b
return shang,yushu
sh,yu=divid(5,2)
当python返回多个值的时候,赋值时也要有同样多的变量来接收。
1.名字相同的局部变量和全局变量
def spam():
egg = 'spam local'
print(egg)
def bacon():
egg = 'bacon local'
print(egg)#print 'bacon local'
spam()
print(egg)#print 'bacon local'
egg='global'
bacon()
print(egg)##print 'global'
输出结果如下:
bacon local
spam local
bacon local
global
从技术上讲,在Python中让局部变量和全局变量同名是完全合法的,但想要程序简单就得避免这么做,因为这3个独立的变量都有相同的名字egg,追踪某一个时刻使用的是哪一个变量,可能会比较麻烦。
2.global语句
在一个函数内修改全局变量,就使用global语句。
def spam():
global egg
egg = 'spam local'
egg='global'
spam()
print(egg)##print 'spam local'
因为egg在spam函数的顶部被声明为global,所以当egg被赋值为‘spam local’时,赋值发生在全局作用域的egg上,没有创建egg局部变量。
在Python中遇到异常或者错误,就意味着整个崩溃,在真实世界的程序中,希望程序能检测错误,处理它们然后继续运行。
例如,运行下面程序,它有一个“除数为0”的错误
def spam(di):
return 40/di
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
运行结果如下:
20.0
3.3333333333333335
ZeroDivisionError: division by zero
当试图用一个数除以0时,就会发生ZeroDivisionError
错误。错误可以由try
和except
语句来处理,可以将前面除数为0的代码放在一个try语句中,如果错误发生,程序执行就转到接下来的except子句开始处。
def spam(di):
try:
return 40/di
except ZeroDivisionError:
print('Error')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))
结果如下:
20.0
3.3333333333333335
Error
None
40.0
如果在try子句中的代码导致一个错误,程序执行就立即转到except子句的代码中,在运行那些代码之后,执行照样继续。
Zigzag 描述:创建往返的锯齿状图形,直到用户按Ctrl-C快捷键停止它为止
分析:在运行Python程序的同时按Ctrl-C快捷键会引发KeyboardInterrupt
异常,因此我们可以用try,except语句来终止程序。这样即使主程序循环是一个无限循环,用户也可以关闭程序。
import time,sys
indent=0
indentIncreasing = True
try:
while True:
print(' '*indent,end=' ')#会输出indent个空格
print('******')
time.sleep(0.1)##循环输出休眠100毫秒
if indentIncreasing:
indent=indent+1
if indent==5:
indentIncreasing=False
else:
indent=indent-1
if indent==0:
indentIncreasing=True
except KeyboardInterrupt:
sys.exit()
运行结果:
******
******
******
******
******
******
******
******
******
******
******
******
知识点:列表的正负索引,len()函数取得列表长度,del 语句从列表删除值,比如:
spam=[1,2,3,4]
del spam[2]
print(spam)##[1, 2, 4]
1.列表的连接和复制:
['x','y','z']*3
[1,2,3]+['a','b','c']
2.enumerate()
函数
在for循环中不用range(len(list))获取列表中各表项的整数索引,还可以调用enumerate()函数,返回列表中表项的索引和列表中的表项本身两个值。
s=[1,2,3,4]
for index, item in enumerate(s):
print(index,item)
3.list一些常见函数:
函数名 | 用处 |
---|---|
index() | 在列表中查找值,返回索引 |
append() | 将参数添加在列表末尾 |
insert(index,参数) | 将参数添加在相应的index处 |
remove() | 从列表中删除值 |
reverse() | 反转列表中的值 |
4.sort()函数
对列表进行排序,当指定reverse关键字为True时,是逆序排序
spam=[3,5,1,10]
spam.sort()
spam##[1, 3, 5, 10]
spam=[3,5,1,10]
spam.sort(reverse=True)
spam##[10, 5, 3, 1]
不可用spam=spam.sort()记录返回值,因为sort()方法不返回列表。
sort()默认使用“ASCII”字符顺序排序,也就是大写字母排在小写字母之前,但加上key关键字的参数,就可以将小写字母排在大写字母之前。
spam=['a','Z','z','A']
spam.sort(key=str.lower)
spam##['a', 'A', 'Z', 'z']
这里其实是将所有表项都当成小写去排序,但实际上并不会改变她们在列表中的值。
注意:字符串和元组是不可变数据,列表是可变数据。
user={
'username':'xiao ming',
'id':2038871
'age':18
}##创建字典
for key,value in user.item()##遍历字典的键和值
for key in user.keys()##变量字典的键
for value in user.value()##遍历字典的值
1.创建一个类的简单实例
class Dog:
"""一次模拟小狗的简单尝试"""
def __init__(self,name,age):
"""初始化属性name和age"""
self.name=name
self.age=age
def sit(self):
"""模拟狗收到命令蹲下"""
print(f"{self.name} is now sitting.")
def roll_over(self):
"""模拟小狗收到命令时打滚"""
print(f"{self.name} rolled over.")
my_dog=Dog('bai',3)
my_dog.sit()
类的定义没有圆括号,因为要从空白创建这个类
__init__()##注意此写法是一边两个下划线,不然会报错
相当于c++类和对象中的构造函数,在创建实例的时候,python都会自动运行它,参数self必不可少,而且必须位于其他形参前面。
2.继承
编写类时,并非总是要从空白开始,如果要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类称为父类,而新有的类称为子类。子类继承了父类所有属性和方法,同时还可以定义自己的属性和方法。
class Car:
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
class ElectricCar(Car):
def __init__(self,make,model,year):
"""初始化父类的属性
再初始化电动汽车特有的属性
"""
super().__init__(make,model,year)
self.battery=75
def describe_battery(self):
print(f"This car has a {self.battery}-KWh battery")
my_car=ElectricCar('teala','model s',2022)
my_car.describe_battery()
super()函数可以调用父类中的方法,父类必须包含在当前文件中,且位于子类前面。
3.重写父类方法
假设car有一个fill_gas()的方法,它对于电动汽车来说毫无意义,因此可以在子类重写,如果有人对电动汽车调用fill_gas()方法,python将忽略Car中的,转而运行子类中的方法,这样使用继承时,可让子类保留从父类那里继承而来的精华,并剔除不需要的糟粕。