函数
定义函数
def my_abs(x):
if x >= 0:
return x
else:
return -x
如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。
return None可以简写为return。
如果你已经把my_abs()的函数定义保存为abstest.py文件了,那么,可以在该文件的当前目录下启动Python解释器,用from abstest import my_abs来导入my_abs()函数,注意abstest是文件名(不含.py扩展名)
空函数
如果想定义一个什么事也不做的空函数,可以用pass语句:
def nop():
pass
pass语句什么都不做,那有什么用?实际上pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。
pass还可以用在其他语句里,比如:
if age >= 18:
pass
缺少了pass,代码运行就会有语法错误。
参数检查
调用函数时,如果参数个数不对,Python解释器会自动检查出来,并抛出TypeError
但是如果参数类型不对,Python解释器就无法帮我们检查。
用内置函数isinstance()实现对参数类型做检查,只允许整数和浮点数类型的参数。
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
返回多个值
return nx, ny
可以做到
但是实际只是返回了一个tuple元组
练习
请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:
ax2 + bx + c = 0
的两个解。
提示:计算平方根可以调用math.sqrt()函数:
>>> import math
>>> math.sqrt(2)
1.4142135623730951
# -*- coding: utf-8 -*-
import math
def quadratic(a, b, c):
if b*b-4*a*c > 0:
return (-b-math.sqrt(b*b-4*a*c))/(2*a),(-b+math.sqrt(b*b-4*a*c))/(2*a)
elif b*b-4*a*c == 0:
return -b/(2*a)
elif b*b-4*a*c < 0:
return
print(quadratic(1, 2, 1))
print(quadratic(1, 2, 2))
print(quadratic(2, 3, 1)) # => (-0.5, -1.0)
print(quadratic(1, 3, -4)) # => (1.0, -4.0)
Result
-1.0
None
(-1.0, -0.5)
(-4.0, 1.0)
小结
一元二次方程的解居然还是上网搜的。。。
/(2*a)这里本来忘加括号,导致结果错了,蠢
最后一个return打错了,之前运行一直没事,直到运行到它才报错
默认参数
def power(x, n=2):
就是可以赋初值,和c一样
设置默认参数时,有几点要注意:
一是必选参数在前,默认参数在后,否则Python的解释器会报错
二是如何设置默认参数。
当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。比如
def enroll(name, gender, age=6, city='Beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll(‘Adam’, ‘M’, city=’Tianjin’),意思是,city参数用传进去的值,其他默认参数继续使用默认值。
递归函数
函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
练习
汉诺塔的移动可以用递归函数非常简单地实现。
请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如:
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
else:
move(n-1, a, c, b)# 先把n-1个盘子从a移到b(即第一个移动到第三个)(假装自己能实现)(进入递归,若n为一,实现啦,若n不为一,继续假装自己能实现,再进入递归)
move(1, a, b, c)# 再把(最后)一个盘子从a移到c(即第一个移动到第三个)(肯定可以)
move(n-1, b, a, c)# 最后把n-1个盘子从b移到c(即第一个移动到第三个)(假装自己能实现)
# 期待输出:
# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C
move(3, 'A', 'B', 'C')
小结
这道题说实话我是一头雾水,根本不知道如何下手,是从网上找的代码然后把代码理解了之后贴上来的。怎么说呢,锅应该是根本没找到思路,压根不知道从何去写,看到他人的代码倒是很容易理解了,不得不佩服思路之巧妙。代码不是那么重要,思路才是的。本来我还想从三层塔里找到规律,没找到。而且没有想到用函数内调用了3次自己,自己的思路里只调用一次自己,没想到啊没想到
杂谈
print(hex(n1),hex(n2))多个输出之间原来要加逗号啊
这个makedown关于代码显示的部分我居然一直都搞错了,心塞
心好痛这网站一天只能发五篇我居然发满了
没有保存之前打的字都没有了,好气啊
本来函数篇我还想分几篇发,结果最后直接把基础篇全部完成了