Python教程|变量,函数,参数,异常
本python编程教程涵盖了变量、函数、参数和异常。
参考以下页面学习完整的Python语言教程。
Python教程page1
Python教程page2
Python教程page3
Python教程第4页
Python教程第5页
Python教程第6页
项目组织与职能
本页将介绍以下内容:
如何组织更大的程序,程序执行的细节,定义和使用函数和
异常和错误处理。
什么是“脚本”?
“脚本”是一个简单地运行一系列语句并停止的程序
# program.py
语句1
statement2
statement3
...
程序结构
回想一下:程序是语句序列
高度= 442 #米
厚度= 0.1*(0.001)#米(0.1毫米)
Numfolds = 0
当厚度<= height:
厚度=厚度* 2
Numfolds = Numfolds + 1
打印numfolds,厚薄
打印numfolds, "需要折叠"
打印“最终厚度是”,厚度,“米”
程序通过执行语句的顺序来运行。
定义的东西
在以后在程序中使用之前,必须始终对事物进行定义。
A = 42
b = a + 2 #要求a已经定义
def广场(x):
返回x *
z = square(b) #需要定义square
顺序很重要
你几乎总是把变量和函数的定义放在开头
定义函数
将与单个“任务”相关的所有代码放在一个地方是个好主意
def read_prices(文件名):
pricesDict = {}
对于open(filename)中的行:
Fields = line.split(',')
[0].strip(' ' ')
pricesDict[name] = float(字段[1])
返回pricesDict
函数还简化了重复操作
Oldprices = read_prices(" Oldprices .csv")
Newprices = read_prices(" Newprices .csv")
什么是函数?
函数是语句序列
def funcname (args):
声明
声明
...
声明
任何Python语句都可以在里面使用
def foo ():
导入数学
打印math.sqrt (2)
帮助(数学)
Python中没有“特殊”语句
函数定义
函数可以按任何顺序定义
def foo (x):
酒吧(x)
def酒吧(x):
语句
函数只能在程序执行期间实际使用之前定义
Foo (3) # Foo必须已经定义
在风格上,更常见的是以“自底向上”的方式定义函数
自底向上的风格
函数被视为构建块
更小/更简单的块先进行
# myprogram.py
def foo (x):
...
def酒吧(x):
...
foo (x)
...
def垃圾邮件(x):
...
酒吧(x)
...
spam(42) #调用spam()来做某事
函数可以在python中重新定义。
def foo (x):
返回2 * x
print foo(2) #打印4
#重定义foo()。这个替代
返回x*y # foo()。
print foo(2,3) #打印6
print foo(2) #错误:foo有两个参数
重复函数定义以静默方式替换先前的定义
没有重载函数(相对于c++, Java)。
功能设计
函数应该易于使用
函数的全部意义在于为重复操作定义代码
一些需要思考的事情:
函数输入和输出
副作用
函数参数
函数对传递的参数进行操作
def广场(x):
返回x *
参数变量在函数被调用时接收它们的值
A =平方(3)
参数名只在函数体中可见(对函数来说是局部的)
默认参数
有时你需要一个可选参数
def read_prices(文件名,分隔符= " "):
...
如果赋值为默认值,则在函数调用中实参是可选的
D = read_prices("prices.csv")
调用函数
考虑一个简单的函数
def read_prices(文件名,分隔符= " "):
...
用“位置”参数调用
价格= read_prices(" Prices .csv",",")
关键字参数
使用"keyword"参数调用
价格= read_prices(文件名="price.csv",分隔符=",")
在这里,您显式地为每个参数命名并赋值
常见用例:具有许多可选特性的函数
def排序(数据、反向= False键= None):
语句
排序(年代,反向= True)
混合参数
位置参数和关键字参数可以在函数调用中混合在一起
read_prices(“prices.csv”分隔符= " ")
位置参数必须先出现。
基本规则:
所有必需的参数都得到值
无重复参数值
返回值
返回语句返回一个值
def广场(x):
返回x *
如果没有返回值,则返回None
def酒吧(x):
语句
返回
a = bar(4) # a =无
如果没有分配/使用,返回值将被丢弃
square(4) #调用square()但放弃结果
多个返回值
函数可以通过返回元组返回多个值
def分裂(a, b):
q = a // b #商
r = a % b #余数
返回一个元组
使用例子:
X =除(34,5)# X = (7,2)
X,y =除(37,5)# X = 7, y = 2
理解变量
程序给变量赋值
x = value #全局变量
def foo ():
y = value #局部变量
变量赋值发生在函数定义的外部和内部
外部定义的变量是“全局的”
函数中的变量是“局部的”
局部变量
函数中的变量是私有的
def read_portfolio(文件名):
Portfolio = []
对于open(filename)中的行:
Fields = line.split()
S = (fields[0],int(fields[1]),float(fields[2]))
portfolio.append (s)
返回组合
返回后不保留或不可访问的值
>>> stocks = read_portfolio("stocks.dat")
> > >字段
回溯(最近一次调用):
文件”
NameError: name 'fields'没有定义
全局变量
函数可以访问全局变量的值
分隔符= ','
def read_portfolio(文件名):
...
对于open(filename)中的行:
Fields = line.split(分隔符)
...
修改全局变量
一个怪癖:函数不能修改全局变量
分隔符= ','
def set_delimiter (newdelimiter):
分隔符=新分隔符
如果你想修改一个全局变量,你必须在函数中声明它
分隔符= ','
def set_delimiter (newdelimiter):
全球分隔符
分隔符=新分隔符
全局声明必须在使用前出现
更多关于函数
变量参数
函数,该函数接受任意数量的参数
def foo (x, * args):
...
在这里,参数作为元组传递
foo(1、2、3、4、5)
def foo (x, * args):
例子:
def print_headers(*标题):
头文件中的h:
打印%10s % h,
打印
Print ("-"*10 + " ")*len(headers)
接受任何关键字args的函数
def foo (x, y, * * kwargs):
...
额外的关键字在字典中传递
foo(2、3、国旗= True,模式=“快速”,标题=“调试”)
def foo (x, y, * * kwargs):
传递元组和字典
元组可以扩展为函数参数
Args = (2,3,4)
foo(1, *args) #与foo(1,2,3,4)相同
字典可以扩展为关键字参数
Kwargs = {
'color': 'red',
'delimiter': ',',
'width': 400}
* * kwargs foo(数据)
#与foo(data,color='red',delimiter=',',width=400)相同
除了在编写库函数时,通常不使用这些函数。
错误检查
Python不执行函数参数类型或值的检查或验证
函数将处理与函数中的语句兼容的任何数据
def添加(x, y):
返回x + y
如果函数中有错误,它们将在运行时显示(作为异常)
例子
def添加(x, y):
返回x + y
Python也不检查函数的返回值
不一致的使用不会导致错误
def foo (x, y):
如果x:
返回x + y
其他:
返回
异常
用于信号错误
引发异常(raise)
如果名字不在名字中:
抛出RuntimeError("Name not found")
捕获异常(尝试)
试一试:
验证(用户名)
除了RuntimeError, e:
打印e
异常传播到第一个匹配的except
def foo ():
试一试:
酒吧()
除了RuntimeError, e:
...
def bar ():
试:1
垃圾邮件()
除了RuntimeError, e:
...
def垃圾邮件():
欣赏()
def神交():
...
提高RuntimeError(“哇!”)
python中有许多内置异常,如下所示:
ArithmeticError
AssertionError
EnvironmentError
EOFError
ImportError
IndexError
KeyboardInterrupt
KeyError
MemoryError
NameError
ReferenceError
RuntimeError
SyntaxError
SystemError
TypeError
ValueError
异常值
大多数异常都有一个相关联的值
更多关于问题的信息
抛出RuntimeError(“无效的用户名”)
传递给提供的变量except
试一试:
...
除了RuntimeError, e:
...
它是异常类型的实例,但通常看起来像一个字符串
除了RuntimeError, e:
打印“失败:原因”,即
捕获多个错误
可以捕获不同类型的异常吗
试一试:
...
除了LookupError, e:
...
除了RuntimeError, e:
...
除了IOError,那么e:
...
除了KeyboardInterrupt, e:
...
或者,如果处理相同
试一试:
...
除了(IOError,那么LookupError RuntimeError), e:
捕捉所有错误
捕获任何异常
试一试:
...
除了例外:
打印“发生错误”
忽略异常(pass)
试一试:
...
除了RuntimeError:
通过……
最后声明
指定无论是否发生异常都必须运行的代码
锁=锁()
lock.acquire ()
试一试:
...
最后:
lock.release() #释放锁
它通常用于正确地管理资源(特别是锁、文件等)。
程序退出
程序退出是通过异常处理的
提高SystemExit
提高SystemExit (exitcode)
有时会看到另一种选择
导入系统
sys.exit ()
sys.exit (exitcode)
捕捉键盘中断(Control-C)
试一试:
语句
除了KeyboardInterrupt:
语句