educoder:Python函数(一)※

第1关:内置函数 - 让你偷懒的工具

任务描述

我们在编程过程中会用到很多函数,但我们不需要每个函数都需要自己去编写,因为Python内置了很多十分有用的函数,我们在编程过程中可以直接调用。

本关目标是让读者了解并掌握一些常用的Python内置函数的用法。

相关知识

数学运算

  • abs():返回数值的绝对值

    例如:

    >>> abs(-4) 4

  • divmod():返回两个数值的商和余数

    例如:

    >>> divmod(7,2) (3,1)

  • max():返回元素中的最大值

    例如:

    >>> max(2,6,1,7) 7

  • min():返回元素中的最小值

    例如:

    >>> min(2,6,1,7) 1

  • sum():返回传入元素之和

    例如:

    >>> sum((1,2,3,4)) 10

    >>> sum([1,2,3,4]) 10

    >>> sum((1,2,3,4),-10) 0

类型转换

  • bool():根据传入的参数的逻辑值创建一个新的布尔值

    例如:

    >>> bool() False

    >>> bool(1) True

    >>> bool(0) False

    >>> bool('str') True

  • int():根据传入的参数创建一个新的整数

    例如:

    >>> int('3') 3

    >>> int('3.6') 3

  • float():根据传入的参数创建一个新的浮点数

    例如:

    >>> float() #不提供参数的时候,返回0.0 0.0

    >>> float(3) 3.0

    >>> float('3') 3.0

complex():根据传入的参数创建一个新的复数


  1. 例如:
  2. `>>> complex() #当两个参数都不提供时,返回复数0j`
  3. `0j`
  4. `>>> complex('2+4j')`
  5. `(2+4j)`
  6. `>>> complex(1,2)`
  7. `(1+2j)`

序列操作

  • all():判断可迭代对象的每个元素是否都为True值

    例如:

    >>> all([1,2,3]) #列表中每个元素逻辑值均为True,返回True True

    >>> all([0,1,2]) #列表中0的逻辑值为False,返回False False

    >>> all(()) #空元组 True

  • any():判断可迭代对象的元素是否有为True值的元素

    例如:

    >>> any([0,1,2]) #列表元素有一个为True,则返回True True

    >>> any([0,0]) #列表元素全部为False,则返回False False

    >>> any([]) #空列表 False

  • sorted():对可迭代对象进行排序,返回一个新的列表

    例如:

    >>> a = ['a','b','d','c','B','A'] >>> a ['a', 'b', 'd', 'c', 'B', 'A']

    >>> sorted(a) # 默认按字符ascii码排序 ['A', 'B', 'a', 'b', 'c', 'd']

对象操作

  • help():返回对象的帮助信息

  • dir():返回对象或者当前作用域内的属性列表

交互操作

  • print():向标准输出对象打印输出

  • input():读取用户输入值

文件操作

  • open():使用指定的模式和编码打开文件,返回文件读写对象

    例如:

    # t为文本读写,b为二进制读写 >>> a = open('test.txt','rt') >>> a.read() 'some text' >>> a.close()

编程要求

本关的编程任务是补全src/Step2/prime.py文件的代码,实现相应的功能。具体要求如下:

  • 定义函数prime,功能是判断整数n是否为素数;
  • 若整数n是素数则返回True,不是素数则返回False

本关涉及的代码文件src/Step2/prime.py的代码框架如下:

  1. #coding=utf-8
  2. #输入一个整数n
  3. n = int(input())
  4. # 请在此添加代码,实现编程要求
  5. #********** Begin *********#
  6. #********** End **********#
  7. print(prime(n))

测试说明

本关的测试文件是src/Step2/prime.py,测试过程如下:

  1. 平台自动编译生成prime.py;
  2. 平台运行prime.py,并以标准输入方式提供测试输入;
  3. 平台获取prime.py输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。

以下是平台对src/Step2/prime.py的样例测试集:

测试输入: 1 预期输出: False

测试输入: 3 预期输出: True

测试输入: 9 预期输出: False

测试输入: 4 预期输出: False

测试输入: 17 预期输出: True


开始你的任务吧,祝你成功!

保持对事业的努力,事业比幻想中的金钱要现实得多。这是必须牢记的原则。

如果你觉得这一关的内容对你有帮助,请你在下面点赞。

代码:

n =  int(input())
def prime(self):
    if self==1:
        return False
    for i in range(2,n):
        if(n%i==0):
            return False
            break
    else:
            return True
print(prime(n))

第2关:外置函数numpy-科学计算工具※

任务描述

本关目标是让读者通过了解一些Numpy三角函数的使用,来理解Python外部库与函数。

相关知识

我们在进行科学公式计算编程过程中会用到很多科学函数,但是我们不用担心不会用,因为在Python中存在一个非常强大的工具Numpy,下面过程中使用Numpy三角函数作为引子,带领大家了解Numpy库与Python中的画图工具。

Numpy函数的导入

Numpy的函数的导入只需要在最开始引入Numpy然后命名即可,在后续的使用中就可以直接引用函数,示范如下:

import numpy as np

这样就导入了numpy库,后续只需要np.xx函数既可以使用xx函数。

Numpy函数

Numpy所带的函数非常多,下面只左右砖头来引美玉,更多的美玉可以直接参考Numpy的说明文档。

linspace函数

linespace函数的完整形态如下:

linespace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

参数:

startscalar类型(这不是一个具体的数据类型,而是指某一些数据类型,比如int,float,bool,long,str等等都属于sclar类型)。这个数参数表示这个序列的开始值。

stopscalar类型。如果endpoint=True。那么stop就是序列的终止数值。当endpoint=False时,返回值中不包含最后一个端点,并且步长会改变。

numint型,可选参数,默认值为50。表示要生成的样本数,必须是非负值。

endpointbool类型。可选参数,默认值为True,这时stop就是最后的样本。为False时,不包含stop的值。

retstepbool类型。可选参数,默认值为True,这时返回值是(samples,step),前面的是数组,后面是步长。

dtype:表示输出的数组的数据类型,如果没有给出就从其他输入中推断输出的类型。

返回值:

samplesndarray类型。在[start,stop]闭区间,或者[start,stop)半闭合区间中,数量为num,步长相等的样本。

stepfloat类型。可选。只有restep参数取值为True时才会返回这个返回值,表示样本中步长。

下面来看一个示范:

  1. import numpy as np
  2. a,b = np.linspace(1, 50, 10, False, True)
  3. print(a)
  4. print(b)

输出如下:

  1. [ 1. 5.9 10.8 15.7 20.6 25.5 30.4 35.3 40.2 45.1]
  2. 4.9

此输出表明,返回的是不包含右闭区间均匀分布的十个样本数,其中样本数的步长为4.9

sin()函数

此函数的完整形态为sin(a),用来求正弦。

如果andarray对象,则np.sin(a) 对矩阵a中每个元素取正弦。

如果a是单个数据值,则np.sin(a)a元素取正弦。

例如:

  1. a = [np.pi,np.pi/2,np.pi/4]
  2. b = np.pi
  3. print(np.sin(a))
  4. print(np.sin(b))
  5. [ 1.22464680e-16 1.00000000e+00 7.07106781e-01]
  6. 1.22464679915e-16

在输出中可以看到,对列表求正弦,则返回列表。对具体数字求正弦,则直接返回其值。

cos()函数

此函数的完整形态为cos(a),用来求余弦。

如果andarray对象,则np.cos(a) 对矩阵a中每个元素取余弦。

如果a是单个数据值,则np.sin(a)a元素取余弦。

下面来看一个整体的例子:

  1. import numpy as np
  2. a = np.array([0, 30, 45, 60, 90])
  3. print('数组中角度的正弦值:')
  4. # 通过乘 pi/180 转化为弧度
  5. print(np.sin(a * np.pi / 180))
  6. print('数组中角度的余弦值:')
  7. print(np.cos(a * np.pi / 180))
  8. 数组中角度的正弦值:
  9. [0. 0.5 0.70710678 0.8660254 1. ]
  10. 数组中角度的余弦值:
  11. [1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
  12. 6.12323400e-17]

编程要求

本关的编程任务是补全右侧文件Begin-End处的代码,实现相应的功能。具体要求如下:

第一题:

绘制如下函数组的曲线(花形),角度属于[0, 2pi]。 x=sin(10θ)cos(θ)

y=sin(10θ)sin(θ)

第二题

绘制如下函数的函数型曲线,角度属于[0, 2pi]。 x=16(sinθ)3

y=13cosθ−5cos2θ−2cos3θ−cos4θ

测试说明

平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。


开始你的任务吧,祝你成功!

保持对事业的努力,事业比幻想中的金钱要现实得多。这是必须牢记的原则。

如果你觉得这一关的内容对你有帮助,请你在下面点赞。

代码:

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
theta=np.linspace(0, 2*np.pi, 1000)
x=np.sin(theta)*np.cos(theta)
y=np.sin(10*theta)*np.sin(theta)
plt.plot(x, y, 'r')
plt.savefig('./src/step4/ans1/轨迹1.png')
print(x[0])
plt.close()
t = np.linspace(0, 2*np.pi, 100)
x =16*np.sin(t)**3
y=13*np.cos(t)-5*np.cos(2*t)-2*np.cos(3*t)-np.cos(4*t)
print(y[0])
plt.plot(x, y, 'r')
plt.axis([-25, 25, -20, 15])
plt.savefig('./src/step4/ans1/轨迹2.png')
plt.close()

第3关:函数正确调用 - 得到想要的结果

任务描述

函数被定义后,本身肯定不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。

本关的目标是让读者了解并掌握函数调用的相关知识。

相关知识

定义函数与调用函数的顺序

在定义了函数之后,就可以调用该函数了,但是在Python中我们要注意一个关键点,就是Python不允许前向引用,即在函数定义之前,不允许调用该函数。例如:

  1. print plus(1,2)
  2. def plus(a,b):
  3. return a+b

运行结果为:

NameError: name 'plus' is not defined

从报错结果可以看出,名字为plus的函数还没进行定义(虽然我们是在后面进行了定义)。所以当我们在调用函数时,一定要确定在调用之前进行了函数定义。

正确使用参数

我们要在调用函数时,需要正确调用函数的名称和参数,例如我们定义了一个加法函数:

  1. def plus(a,b):
  2. return a+b

我们在调用plus()函数时,如果传入的参数类型不对,会报TypeError错误。而且有时我们传入的参数类型不是规定类型的话,就算调用函数运行结果没有报错,也会产生逻辑错误。例如:

  1. #定义plus函数,作用是求两个正整数之和
  2. def plus(a,b):
  3. return a+b
  4. #调用plus函数,参数类型为'1','2'
  5. print(plus('1','2'))

输出结果:

12

虽然上述例子的程序运行结果没有报错,但是结果却与我们的预期不符,因为我们的本意是调用plus()函数实现两个整数的加法,但是如果我们传入的是字符串类型的数值时,结果就是两个字符串的拼接。

所以这个例子告诉我们一定要注意传入参数的类型。

当我们传入正常类型的参数时,传入的参数个数不一致时,也会报TypeError错误,例如:

  1. #定义plus函数,作用是求两个正整数之和
  2. def plus(a,b):
  3. return a+b
  4. #调用plus函数,参数为1,2,3
  5. print(plus(1,2,3))

报错:

TypeError: plus() takes 2 positional arguments but 3 were given

报错原因显示,因为plus()函数允许有且仅有2个参数,但是却在调用时传入了3个参数,所以程序报错。

函数的调用十分重要,只有学会正确调用函数,才会得到正确的函数运行结果。

编程要求

本关的编程任务是补全src/Step2/func_call.py文件的代码,实现相应的功能。具体要求如下:

  • 定义函数bubbleSort,对参数(一个数值列表)进行从小到大顺序排序;
  • 函数返回排序后的数值列表。

本关涉及的代码文件src/Step2/func_call.py的代码框架如下:

  1. #coding=utf-8
  2. #输入数字字符串,并转换为数值列表
  3. a = input()
  4. num1 = eval(a)
  5. numbers = list(num1)
  6. # 请在此添加函数bubbleSort代码,对数值列表numbers实现从小到大排序
  7. #********** Begin *********#
  8. #********** End **********#
  9. print(bubbleSort(numbers))

测试说明

本关的测试文件是src/Step2/func_call.py,测试过程如下:

  1. 平台自动编译生成func_call.py;
  2. 平台运行func_call.py,并以标准输入方式提供测试输入;
  3. 平台获取func_call.py输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。

以下是平台对src/Step2/func_call.py的样例测试集:

测试输入: 103,47,21,34,11,2,5,88,13 预期输出: [2, 5, 11, 13, 21, 34, 47, 88, 103]

测试输入: 12,31,0,23,25,109,77,3 预期输出: [0, 3, 12, 23, 25, 31, 77, 109]

测试输入: 6,4,11,34,12,1,4 预期输出: [1, 4, 4, 6, 11, 12, 34]

测试输入: 5,4,3,2,1 预期输出: [1, 2, 3, 4, 5]


开始你的任务吧,祝你成功!

保持对事业的努力,事业比幻想中的金钱要现实得多。这是必须牢记的原则。

如果你觉得这一关的内容对你有帮助,请你在下面点赞。

代码:

a = input()
num1 = eval(a)
numbers = list(num1)
print(sorted(numbers))

第4关:函数与函数调用 - 分清主次

任务描述

我们一般将字符串、列表等变量作为参数进行函数调用。但函数本身也是一个对象,所以我们也可以将函数作为参数传入另外一个函数中并进行调用。

本关的目标是让读者了解并掌握函数作为参数传入另外一个函数中并进行调用的相关知识。

相关知识

我们要学习函数与函数之间的调用,就应该对函数调用的顺序与参数有清晰的认识,我们将会从五种情况让读者了解并掌握函数与函数之间的调用的基本关系和联系。

第一种情况

程序代码如下:

  1. def x(f):
  2. def y():
  3. print(1)
  4. return y
  5. def f():
  6. print(2)
  7. x(f)

运行结果:打印出无结果。

分析:因为第9行中的x(f)中的f没有带括号,所以f只是一个普通的参数,所以程序只调用执行了x(f)函数,没有调用执行f()函数。x(f)函数中虽然也定义了y()函数,但是x(f)函数中没有调用执行y()函数,只是执行了return y。而y变量也没有值,所以整个程序的返回值就为无结果。

第二种情况

程序代码如下:

  1. def x(f):
  2. def y():
  3. print(1)
  4. return y
  5. def f():
  6. print(2)
  7. x(f())

运行结果:2

分析:因为第9行中的x(f())中的f()带括号,所以程序先调用执行f()函数,打印输出2。因为f()函数没有return语句,故没有确切的数值传入到x(f)函数中(或者可以理解为f()函数的返回值为None),程序开始调用执行x(f)函数。x(f)函数中虽然也定义了y()函数,但是x(f)函数中没有调用执行y()函数,只是执行了return y。而y变量也没有值,所以调用执行x(f)函数没有产生任何结果。

所以该程序最终只打印输出了2

第三种情况

程序代码如下:

  1. def x(f):
  2. def y():
  3. print(1)
  4. return y()
  5. def f():
  6. print(2)
  7. x(f)

运行结果:1

分析:因为第9行中的x(f)中的f没有带括号,所以f只是一个普通的参数,所以程序只调用执行了x(f)函数,没有调用执行f()函数。x(f)函数中也定义了y()函数,并且返回的是y()函数的执行结果。所以程序调用执行了y()函数,打印输出结果是1

第四种情况

程序代码如下:

  1. def x(f):
  2. def y():
  3. print(1)
  4. return y()
  5. def f():
  6. print(2)
  7. x(f())

运行结果: 2 1

分析:因为第9行中的x(f())中的f()带括号,所以程序先调用执行f()函数,先打印输出2。因为f()函数没有return语句,故没有确切的数值传入到x(f)函数中(或者可以理解为f()函数的返回值为None),程序开始调用执行x(f)函数。x(f)函数中也定义了y()函数,并且返回的是y()函数的执行结果。所以程序也调用执行了y()函数,打印输出了1

所以该程序先后输出了21

第五种情况

程序代码如下:

  1. def x(f):
  2. def y():
  3. print(1)
  4. print(f())
  5. return y()
  6. def f():
  7. #print(2)
  8. return 2
  9. x(f)

运行结果:

1 2

分析:因为第9行中的x(f)中的f没有带括号,所以f只是一个普通的参数,所以程序先只是调用执行了x(f)函数。在x(f)函数中也定义了y()函数,而且返回值是y()函数的执行结果,所以程序会调用执行y()函数。在y()函数中先是执行print(1)语句,打印输出1。接着执行print(f())语句,所以程序在这时也会调用执行f()函数,打印输出2

所以该程序先后输出了12

以上是对函数与函数之间调用的五种情况的探讨与分析,函数作为参数传入另外一个函数中并进行调用的情况有很多,我们需要时刻注意函数调用的相关要求与细节,才能正确使用函数。

编程要求

本关的编程任务是补全src/step3/func_ref.py文件的代码,实现相应的功能。具体要求如下:

  • 定义函数circle_area,要求实现圆的面积计算;
  • 函数需要根据半径的不同值采取不同处理过程,若半径值为合法数值,则返回圆面积(圆面积四舍五入后保留两位小数);否则在函数中直接打印输出“You must input an integer or float as radius.”

本关涉及的代码文件src/step3/func_ref.py的代码框架如下:

  1. #coding=utf-8
  2. from math import pi as PI
  3. n = int(input())
  4. # 请在此添加函数circle_area的代码,返回以n为半径的圆面积计算结果
  5. #********** Begin *********#
  6. #********** End **********#
  7. print(circle_area(n))

测试说明

本关的测试文件是src/step3/func_ref.py,测试过程如下:

  1. 平台自动编译生成func_ref.py;
  2. 平台运行func_ref.py,并以标准输入方式提供测试输入;
  3. 平台获取func_ref.py输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。

以下是平台对src/step3/func_ref.py的样例测试集:

测试输入: 4 预期输出: 50.27

测试输入: 5 预期输出: 78.54

测试输入: 6 预期输出: 113.10

测试输入: 111 预期输出: 38707.56


开始你的任务吧,祝你成功!

你可以忘掉失败,但不能忘掉教训;你可以忘掉昨天,但不能忘记历史;你可以忘掉苦难,但不能忘却艰辛;你可以忘掉伤疤,但不能忘却耻辱。

如果你觉得这一关的内容对你有帮助,请你在下面点赞。

代码:

from math import pi as PI
n = int(input())
def area(n):
    return(PI*n*n)
print("%.2f"% area(n))

你可能感兴趣的:(python,numpy,开发语言)