python学习(7)——函数基础篇

函数

定义函数

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关于代码显示的部分我居然一直都搞错了,心塞
心好痛这网站一天只能发五篇我居然发满了
没有保存之前打的字都没有了,好气啊
本来函数篇我还想分几篇发,结果最后直接把基础篇全部完成了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值