Python编程-让繁琐的工作自动化(三)函数

1.函数的定义

#函数的定义
#def 语句和参数
def hello(name):
	print('hello' + name)

#调用函数
hello('lily')
hello('kity')

2.返回值和return语句

import random

def getAnswer(asNum):
	if asNum == 1:
		return 'it is certain'
	elif asNum == 2:
		return 'it is decidedly no'
	elif asNum == 3:
		return 'yes'

r = random.randint(1,3)
ret = getAnswer(r)
print(ret)

上述调用过程可以缩写为一行代码: print(getAnswer(random(1,9)))

3.None 值

None值是NoneType数据类型的唯一值,其他变成语言可能为NULL,nil或undefined。

没有返回值得函数可以将return语句返回None

4.关键字参数和print()

大多数参数是由他们在函数中调用的位置来识别的。例如random.randint(1,10)与random.randint(10,1)不同,函数调用random.randint(1,10)将返回1到10之间的一个随机整数,因为第一个参数是范围的下界,第二个参数是范围的下界。而random.randint(10,1)会导致错误。

但是“关键字参数”是有函数调用是加在他们前面的关键字来识别的,关键字参数通常用于可选变元。例如print()函数有可选的变元end和sep,分别指定在参数末尾打印什么,以及在参数之间打印什么来隔开他们,

例如:

print('helloe')
print('world')

输出会是

hello

world

因为print()函数自动在传入的字符串末尾添加了换行符,可以设置end关键字参数,将它变为另一个字符串,例如:

print('hello', end='')
print('world')

输出为

helloworld 

例如还可以传入sep关键字参数,替换默认的分隔字符串。因为print()传入多个字符串值,该函数就会自动用一个空格分隔它们。

>>> print('cats','dogs','mice')
cats dogs mice
>>> print('cats','dogs','mice',sep=',')
cats,dogs,mice

也可以在自己编写的函数中添加关键字参数,但需要用到列表和字典数据类型,后面将会学习到。

5.局部和全局作用域

在被调用函数内部赋值的变元和变量,处于该函数的局部作用域内,称为局部变量,在所有函数之外赋值的变量,处于全局作用域,称为全局变量。

同其他编程语言相似,全局作用域中的代码不能使用任何局部变量,但是局部作用域可以访问全局变量。

规则:

<1>局部变量不能在全局作用域内使用

<2>局部作用域不能使用其他局部作用域内的变量

<3>全局变量可以在局部作用域中读取

6.global语句

如果需要在一个函数内修改全局变量,就使用global语句。如果在函数顶部有global eggs 这样的代码,它就告诉python,在这个函数中,eggs指的是全局变量,所以,应该避免使用这个名字在函数内创建变量。

def spam():
    global eggs
    eggs = 'spam' # this is the global

def bacon():
    eggs = 'bacon' # this is a local

def ham():
    print(egg) #this is the global

eggs = 42 #this is the global
spam()
print(eggs);

7.异常处理

到目前为止,在python程序中遇到错误或异常,以为这整个程序崩溃,那么如何使程序检测出错误并继续运行呢?

 

举个例子:除数为0的情况

def dodevid(devideBy):
	try:
		return 42 / devideBy
	except ZeroDivisionError:
		print('Error: Invalid argument.')
	
print(dodevid(2))
print(dodevid(12))
print(dodevid(0))
print(dodevid(1))

输出:

21.0
3.5
Error: Invalid argument.
None
42.0

如果没有try--except,将会在调用dodevid(0)的时候导致错误终端程序。

再来看另一个例子:

def dodevid(devideBy):
	return 42 / devideBy


try:	
	print(dodevid(2))
	print(dodevid(12))
	print(dodevid(0))
	print(dodevid(1))
except ZeroDivisionError:
	print('Error: Invalid argument.')

输出:

21.0
3.5
Error: Invalid argument.

print(dodevid(1) )没有被调用就跳转到了except语句。

注意:

在函数中调用的try语句块中,发生的所有错误都会被捕捉。print(dodevid(1))从未被执行时因为,一旦执行调到except字句的代码,就不会回到try字句,它会继续照常向下执行。

下面贴一个小函数:collatz

#编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()
#就打印出number//2,并返回该值,如果number是奇数,collatz()就打印并返回3*number+1;
#
#然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),知道函数返回值1,
#(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到1)
#
#记得将input()返回值用int()函数专程一个整数,否则他会是一个字符串

#如果number%2==0,整数number就是偶数,如果number%2==1,他就是奇数
'''
这个程序的输出看起来应该像这样:
3
10
5
16
8
4
2
1
'''    

def collatz(number):
	procNum = 0
	if number % 2 == 0:
		procNum = number//2
		print(procNum)
		return procNum
	elif number % 2 == 1 and number > 1:
		procNum = 3 * number +1
		print(procNum)
		return procNum
	elif number == 1:
		print(number)
		return number
	
def docollatz():
	number = input('now,you can input a number to test>>')
	try:
		number = int(number)
	except ValueError:
		print("your input is not a number")
		return 0;
		
	while True:
		number = collatz(number)
		if number == 1:
			break
 
docollatz()

输出:

now,you can input a number to test
100
50
25
76
38
19
58
29
88
44
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

总结:

函数是将代码逻辑分组的主要方式,因为函数中的变量存在于他们自己的局部作用域内,所以一个函数中的代码不能直接影响其他函数中的变量,这限制了那些代码才能改变那些变量的值,对于调试代码是很有帮助的。

在没有使用try之前,一个错误就会导致程序崩溃,利用try-except可以使程序自己检测到错误,并针对错误进行处理,继续运行后面的程序。

由于是C/C++开发出身,因此在写python程序的时候,总是不自觉地加上括号,分号结尾等,虽然没有错误,但还是要体现python的风格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值