函数的使用
类似于数学中的函数,Python的可以利用函数来解决问题,那么我们不免要问,什么是函数,为什么要使用函数,如何使用?
1. 函数的定义
2. 函数的意义
3. 函数的使用
4. 练习
1. 函数的定义
在数学中函数是一种映射,其功能是将自变量的值(输入)映射为一个函数值(输出)。编程语言中的函数则是一段代码,可以根据一段输入进行计算,并且产生输出。
2. 函数的意义
当我们需要重复做一件事情的时候(但是根据输入会有不同输出), 这个时候如果我们可以定义一个函数来执行,从而降低代码的重复率。
如果我们需要实现一件事情,而且这件事情十分复杂,这样如果我们在代码中直接的写出如何处理,代码将十分长且复杂,让人看不懂,这时我们可以定义一个函数,这个函数来解决这个问题,而在主程序中只需要调用这个函数就可以了
函数可以增强程序的通用性表现在我们可以通过设置不同的参数,从而可以解决同种类型相似的问题,而避免过多的内容
3. 函数的使用
Python中函数的使用有特定的语法:
def <函数名> (<形式参数>)
<函数体>
在上述定义中,函数名是一个函数的标识符,命名必须遵守一定的规范(见变量的使用);形式参数可以为空,也可以是用逗号分开的变量名序列;函数体是语句序列,左端必须缩进。
一旦我们定义了一个函数,那么我们便可以随时的调用这个函数,函数的调用为:
<函数名>(<实际参数>)
事实上,当Python遇到一个函数调用的时候,将进行以下的操作:
- 调用者 p 在调用点暂停(又称挂起)
- 函数 f 的形式参数被赋予给实际参数的值
- 执行函数 f 的函数体
- f 执行完毕时,控制返回到 p 中调用点的下一条语句
下面举例子来说明函数的简单使用
"""
Author: Cyberist
"""
def verify():
username = input("Username: ")
passwd = input("Passwd: ")
if username == "admin" and passwd =="12345":
print("Login in successfully")
verify( )
在上面的代码中,我们定义了一个无参数的函数,函数的功能是检查登录是否成功,然后我们调用这个函数,如果用户输入的数据满足调节,则提示登录成功。
在函数调用的时候,通常的时候采用的是按位置匹配,但是Python中还可以使用关键字参数,形如 <形参名>=<实参名>
,这样使用,我们便可以不必要拘束于参数的位置
比如下面的这个函数:
def print_weclome(name,day):
print("Hello %s, today is %s"%(name, day))
# 调用的时候可以这样调用
print_welcome("John", "10-28")
# 同时也可以这样调用
print_welcome(day='10-28', "john")
程序中的每个变量都有自己的作用域,只有在对应的区域内访问这个变量,才可以取得理想的结果,变量分为以下两种
在一个函数中定义的变量为局部变量,因为他们的作用域局限于这个函数的函数体,在函数外部是没有被定义的,如果在函数外访问会出现下面的结果
>>> def main( ):
... a = 10
... b = 10
...
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
全局变量是在程序中的任意地方都可以访问的变量,一般而言,全局变量是在程序的非函数中定义的变量,前面没有缩进,但是我们也可以使用global
显式的声明全局变量,这样在函数体内我们也可以变这个变量,但是此时仍然需要在函数体定义好了这个变量
str = "Hello World"
def test( ):
global str
str += "Welcome to Python !"
print(str)
如果没有`global`声明,函数调用是不会改变变量的值的
```python
"""
显式声明了
Author: Cyberist
"""
>>> a = 100
>>> def test( ):
... global a
... a = 10
...
>>> test( ) # 调用函数之后改变了 a 的值
>>> a
10
"""
没有声明
Author: Cyberist
"""
>>> a = 100
>>> def test( ):
... a =10
...
>>> test( ) # 调用函数之后没有改变 a 的值
>>> a
100
函数可以处理输入的数据,然后进行一定的输出,我们可以让它们输出到屏幕之上,我们可以获取它的值,我们只需要使用return
关键字就可以实现这个功能
def test():
"""
Author: Cyberist
"""
num = float(input("Input a number, return its sqare: "))
return num**2
# 这样我们便可以安装下面的这种方式调用函数
an = test()
print(an)
# 输入 2 便会得到输入 4 ,变量 an 中保存的数据是 4
练习
- 给定两个平面的点 p1 和 p2(用元组表示),函数slope(p1, p2)可以返回两点之间的斜率,函数intercept(p1, p2)返回该直线在y轴上的截距
说明: 元组用( ),表示,其中的值一旦定义便不可以改变,如果有C/C++编程基础的可以类比于数组,但是这个数组不能改变,我们可以用方括号[ ]来进行索引,如元组 p1, 则 p1[0]是第一个数,p[1]是第二个数据
Answer:
# -*- coding=utf-8 -*-
"""
Author: Cyberist
"""
import math
def slope(p1,p2):
"""
p1 -> 位置参数一
p2 -> 位置参数二
func: 计算两点之间的斜率,即使是垂直的直线也可以正确计算
"""
try:
x_diff = p1[0]-p2[0]
y_diff = p1[1]-p2[1]
if abs(x_diff) <= 1e-15:
# 当x相等的时候,这里采用足够小,因为二进制计算会有误差
return math.inf
except Exception as e:
print(e)
else:
return y_diff/x_diff
def intercept(p1,p2):
"""
p1 -> 位置参数一
p2 -> 位置参数二
func: 计算两点构建的直线的截距
"""
try:
slope_value = slope(p1, p2)
if slope_value == math.inf:
return "Do not exist"
except Exception as e:
print(e)
else:
return (p1[1]-slope_value*p1[0])
def main(p1,p2):
# 显示目前测试的位置
print("Position 1 is : {}".format(p1))
print("Position 2 is : {}".format(p2))
# 计算斜率
slope_value = slope(p1, p2)
# 计算截距
intercept_value = intercept(p1, p2)
# 输出计算结果
print("Slope: {}".format(slope_value,))
print("Intercept: {}".format(intercept_value))
main(p1,p2)
input("Press Enter to exit...") # 防止闪退
- 设计一个函数,可以判断某一年是否是闰年
Answer:
def is_leap_year(year):
"""
Author: Cyberist
year : 输入的年份
功能: 判断输入的年份是否是闰年,并提示
"""
if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
print("It is a leap year ")
else:
print("It is not a leap year")
year = int("Please input a year to test: ")
is_leap_year(year)
- 设计一个函数,可以实现求从 0 到输入数据 n 的全部能被 3 整除但是不能被 5 整除的数的和。
"""
Author: Cyberist
"""
def main(num):
sum = 0 # 记录数值之和
for i in range(1,num+1): # range中不包含最后一个数
if i % 3 == 0 and i % 5 != 0:
sum += i # 累计求和
print("The sum is ", sum)
num = int(input("Input a number: "))
main(num) # 调用函数