100
任务描述
我们在编程过程中会用到很多函数,但我们不需要每个函数都需要自己去编写,因为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()
:根据传入的参数创建一个新的复数
例如:
`>>> complex() #当两个参数都不提供时,返回复数0j`
`0j`
`>>> complex('2+4j')`
`(2+4j)`
`>>> complex(1,2)`
`(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
的代码框架如下:
#coding=utf-8
#输入一个整数n
n = int(input())
# 请在此添加代码,实现编程要求
#********** Begin *********#
#********** End **********#
print(prime(n))
测试说明
本关的测试文件是src/Step2/prime.py
,测试过程如下:
prime.py
;prime.py
,并以标准输入方式提供测试输入;prime.py
输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。以下是平台对src/Step2/prime.py
的样例测试集:
测试输入: 1
预期输出: False
测试输入: 3
预期输出: True
测试输入: 9
预期输出: False
测试输入: 4
预期输出: False
测试输入: 17
预期输出: True
开始你的任务吧,祝你成功!
保持对事业的努力,事业比幻想中的金钱要现实得多。这是必须牢记的原则。
如果你觉得这一关的内容对你有帮助,请你在下面点赞。
- #coding=utf-8
-
- #输入一个整数n
- n = int(input())
-
- # 请在此添加代码,实现编程要求
- #********** Begin *********#
- def prime(n):
- isPrime=1
- if n==1:
- isPrime=0
- return False
- for i in range(2,n-1):
- if n%i==0:
- isPrime=0
- return False
- break
- if isPrime:
- return True
- #********** End **********#
- print(prime(n))
300
任务描述
本关目标是让读者通过了解一些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)
参数:
start
:scalar
类型(这不是一个具体的数据类型,而是指某一些数据类型,比如int
,float
,bool
,long
,str
等等都属于sclar
类型)。这个数参数表示这个序列的开始值。
stop
:scalar
类型。如果endpoint=True
。那么stop就是序列的终止数值。当endpoint=False
时,返回值中不包含最后一个端点,并且步长会改变。
num
:int
型,可选参数,默认值为50
。表示要生成的样本数,必须是非负值。
endpoint
:bool
类型。可选参数,默认值为True
,这时stop
就是最后的样本。为False
时,不包含stop
的值。
retstep
:bool
类型。可选参数,默认值为True
,这时返回值是(samples,step)
,前面的是数组,后面是步长。
dtype
:表示输出的数组的数据类型,如果没有给出就从其他输入中推断输出的类型。
返回值:
samples
:ndarray
类型。在[start,stop]
闭区间,或者[start,stop)
半闭合区间中,数量为num
,步长相等的样本。
step
:float
类型。可选。只有restep
参数取值为True
时才会返回这个返回值,表示样本中步长。
下面来看一个示范:
import numpy as np
a,b = np.linspace(1, 50, 10, False, True)
print(a)
print(b)
输出如下:
[ 1. 5.9 10.8 15.7 20.6 25.5 30.4 35.3 40.2 45.1]
4.9
此输出表明,返回的是不包含右闭区间均匀分布的十个样本数,其中样本数的步长为4.9
sin()函数
此函数的完整形态为sin(a)
,用来求正弦。
如果a
为ndarray
对象,则np.sin(a)
对矩阵a
中每个元素取正弦。
如果a
是单个数据值,则np.sin(a)
对a
元素取正弦。
例如:
a = [np.pi,np.pi/2,np.pi/4]
b = np.pi
print(np.sin(a))
print(np.sin(b))
[ 1.22464680e-16 1.00000000e+00 7.07106781e-01]
1.22464679915e-16
在输出中可以看到,对列表求正弦,则返回列表。对具体数字求正弦,则直接返回其值。
cos()函数
此函数的完整形态为cos(a)
,用来求余弦。
如果a
为ndarray
对象,则np.cos(a)
对矩阵a
中每个元素取余弦。
如果a
是单个数据值,则np.sin(a)
对a
元素取余弦。
下面来看一个整体的例子:
import numpy as np
a = np.array([0, 30, 45, 60, 90])
print('数组中角度的正弦值:')
# 通过乘 pi/180 转化为弧度
print(np.sin(a * np.pi / 180))
print('数组中角度的余弦值:')
print(np.cos(a * np.pi / 180))
数组中角度的正弦值:
[0. 0.5 0.70710678 0.8660254 1. ]
数组中角度的余弦值:
[1.00000000e+00 8.66025404e-01 7.07106781e-01 5.00000000e-01
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
-
- # 第一题
- #x = sin(10\theta)cos(\theta)
- #y = sin(10\theta)sin(\theta)
- theta=np.linspace(0, 2*np.pi, 1000)
- ############ begin ##########
- # 求出2pi区间下均匀分布的1000个点
- x=np.sin(10*theta)*np.cos(theta)
- ############ end ############
- 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()
-
-
- # 第2题
- # 求2pi区间下均匀分布的100个点
- t = np.linspace(0, 2*np.pi, 100)
- x =16*np.sin(t)**3
- # 求y值,并直接输出
- ############ begin ##########
- y=13*np.cos(t)-5*np.cos(2*t)-2*np.cos(3*t)-np.cos(4*t)
- ############ end ############
- print(y[0])
- plt.plot(x, y, 'r')
- plt.axis([-25, 25, -20, 15])
- plt.savefig('./src/step4/ans1/轨迹2.png')
- plt.close()
-
300
任务描述
函数被定义后,本身肯定不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。
本关的目标是让读者了解并掌握函数调用的相关知识。
相关知识
定义函数与调用函数的顺序
在定义了函数之后,就可以调用该函数了,但是在Python
中我们要注意一个关键点,就是Python
不允许前向引用,即在函数定义之前,不允许调用该函数。例如:
print plus(1,2)
def plus(a,b):
return a+b
运行结果为:
NameError: name 'plus' is not defined
从报错结果可以看出,名字为plus
的函数还没进行定义(虽然我们是在后面进行了定义)。所以当我们在调用函数时,一定要确定在调用之前进行了函数定义。
正确使用参数
我们要在调用函数时,需要正确调用函数的名称和参数,例如我们定义了一个加法函数:
def plus(a,b):
return a+b
我们在调用plus()
函数时,如果传入的参数类型不对,会报TypeError
错误。而且有时我们传入的参数类型不是规定类型的话,就算调用函数运行结果没有报错,也会产生逻辑错误。例如:
#定义plus函数,作用是求两个正整数之和
def plus(a,b):
return a+b
#调用plus函数,参数类型为'1','2'
print(plus('1','2'))
输出结果:
12
虽然上述例子的程序运行结果没有报错,但是结果却与我们的预期不符,因为我们的本意是调用plus()
函数实现两个整数的加法,但是如果我们传入的是字符串类型的数值时,结果就是两个字符串的拼接。
所以这个例子告诉我们一定要注意传入参数的类型。
当我们传入正常类型的参数时,传入的参数个数不一致时,也会报TypeError
错误,例如:
#定义plus函数,作用是求两个正整数之和
def plus(a,b):
return a+b
#调用plus函数,参数为1,2,3
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
的代码框架如下:
#coding=utf-8
#输入数字字符串,并转换为数值列表
a = input()
num1 = eval(a)
numbers = list(num1)
# 请在此添加函数bubbleSort代码,对数值列表numbers实现从小到大排序
#********** Begin *********#
#********** End **********#
print(bubbleSort(numbers))
测试说明
本关的测试文件是src/Step2/func_call.py
,测试过程如下:
func_call.py
;func_call.py
,并以标准输入方式提供测试输入;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]
开始你的任务吧,祝你成功!
保持对事业的努力,事业比幻想中的金钱要现实得多。这是必须牢记的原则。
如果你觉得这一关的内容对你有帮助,请你在下面点赞。
- #coding=utf-8
-
- #输入数字字符串,并转换为数值列表
- a = input()
- num1 = eval(a)
- numbers = list(num1)
-
- # 请在此添加函数bubbleSort代码,实现编程要求
- #********** Begin *********#
- def bubbleSort(numbers):
- numbers.sort()
- return numbers
- #********** End **********#
- print(bubbleSort(numbers))
-
-
-
300
任务描述
我们一般将字符串、列表等变量作为参数进行函数调用。但函数本身也是一个对象,所以我们也可以将函数作为参数传入另外一个函数中并进行调用。
本关的目标是让读者了解并掌握函数作为参数传入另外一个函数中并进行调用的相关知识。
相关知识
我们要学习函数与函数之间的调用,就应该对函数调用的顺序与参数有清晰的认识,我们将会从五种情况让读者了解并掌握函数与函数之间的调用的基本关系和联系。
第一种情况
程序代码如下:
def x(f):
def y():
print(1)
return y
def f():
print(2)
x(f)
运行结果:打印出无结果。
分析:因为第9
行中的x(f)
中的f
没有带括号,所以f
只是一个普通的参数,所以程序只调用执行了x(f)
函数,没有调用执行f()
函数。x(f)
函数中虽然也定义了y()
函数,但是x(f)
函数中没有调用执行y()
函数,只是执行了return y
。而y
变量也没有值,所以整个程序的返回值就为无结果。
第二种情况
程序代码如下:
def x(f):
def y():
print(1)
return y
def f():
print(2)
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
。
第三种情况
程序代码如下:
def x(f):
def y():
print(1)
return y()
def f():
print(2)
x(f)
运行结果:1
分析:因为第9
行中的x(f)
中的f
没有带括号,所以f
只是一个普通的参数,所以程序只调用执行了x(f)
函数,没有调用执行f()
函数。x(f)
函数中也定义了y()
函数,并且返回的是y()
函数的执行结果。所以程序调用执行了y()
函数,打印输出结果是1
。
第四种情况
程序代码如下:
def x(f):
def y():
print(1)
return y()
def f():
print(2)
x(f())
运行结果: 2
1
分析:因为第9
行中的x(f())
中的f()
带括号,所以程序先调用执行f()
函数,先打印输出2
。因为f()
函数没有return
语句,故没有确切的数值传入到x(f)
函数中(或者可以理解为f()
函数的返回值为None
),程序开始调用执行x(f)
函数。x(f)
函数中也定义了y()
函数,并且返回的是y()
函数的执行结果。所以程序也调用执行了y()
函数,打印输出了1
。
所以该程序先后输出了2
和1
。
第五种情况
程序代码如下:
def x(f):
def y():
print(1)
print(f())
return y()
def f():
#print(2)
return 2
x(f)
运行结果:
1
2
分析:因为第9
行中的x(f)
中的f
没有带括号,所以f
只是一个普通的参数,所以程序先只是调用执行了x(f)
函数。在x(f)
函数中也定义了y()
函数,而且返回值是y()
函数的执行结果,所以程序会调用执行y()
函数。在y()
函数中先是执行print(1)
语句,打印输出1
。接着执行print(f())
语句,所以程序在这时也会调用执行f()
函数,打印输出2
。
所以该程序先后输出了1
和2
。
以上是对函数与函数之间调用的五种情况的探讨与分析,函数作为参数传入另外一个函数中并进行调用的情况有很多,我们需要时刻注意函数调用的相关要求与细节,才能正确使用函数。
编程要求
本关的编程任务是补全src/step3/func_ref.py
文件的代码,实现相应的功能。具体要求如下:
circle_area
,要求实现圆的面积计算;“You must input an integer or float as radius.”
。本关涉及的代码文件src/step3/func_ref.py
的代码框架如下:
#coding=utf-8
from math import pi as PI
n = int(input())
# 请在此添加函数circle_area的代码,返回以n为半径的圆面积计算结果
#********** Begin *********#
#********** End **********#
print(circle_area(n))
测试说明
本关的测试文件是src/step3/func_ref.py
,测试过程如下:
func_ref.py
;func_ref.py
,并以标准输入方式提供测试输入;func_ref.py
输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。以下是平台对src/step3/func_ref.py
的样例测试集:
测试输入: 4
预期输出: 50.27
测试输入: 5
预期输出: 78.54
测试输入: 6
预期输出: 113.10
测试输入: 111
预期输出: 38707.56
开始你的任务吧,祝你成功!
你可以忘掉失败,但不能忘掉教训;你可以忘掉昨天,但不能忘记历史;你可以忘掉苦难,但不能忘却艰辛;你可以忘掉伤疤,但不能忘却耻辱。
如果你觉得这一关的内容对你有帮助,请你在下面点赞。
- #coding=utf-8
-
- from math import pi as PI
-
- n = int(input())
-
- # 请在此添加函数circle_area的代码,返回以n为半径的圆面积计算结果
- #********** Begin *********#
- def circle_area(n):
- return PI*n**2
- #********** End **********#
- print("%.2f"%circle_area(n))