函数与模块
函数
来优化地铁问题!在编程的语境下,”函数“
这个词的意思是对一系列语句的组合,这些语句共同完成一种运算
。
在上一章中,有一个 运算
, 求绝对值算法
:
a = -1
jueduizhi = a
if a < 0:
jueduizhi = -a
其实,系统已经提供了 绝对值算法
(绝对值函数
)
abs(变量)
就是求变量绝对值的函数,上面两种写法的效果是一样的。(思考:abs() 函数实现的语句是如何的?思路跟我们自己写应该一样吧。)
print
len
str
这几个运算(函数) 还记得吗?
+
-
*
/
这些符号运算之外的,用 print
这样的一个字母命名的 运算
都是 函数
print
是这个函数的名字 (函数名)print(s)
我们用 函数名(变量)
(两个括号包含要运算的变量) 的语法来 调用
函数,调用
意思其实就是运算abs(a)
语法也一样参数
(参与运算的变量) 并非只能是一个print("a", "bc", 123)
参数
(参与运算的变量)呢,每一个函数不一样(正如每个运算不一样)
现在我们就用 函数
这个词来表示这种运算了,反正我们理解 函数
就是能做计算的,但不是 +
-
*
/
这类单符号运算。
模块
, 比如数学相关函数,都放到 math
模块下math
有哪些函数呢?你能想到的数学相关函数都有!要用数据函数,需要先import math
引入模块
import math
#然后才能调用数学函数
随机相关的函数
import random
系统相关的函数(文件等等)
import os
网络请求相关函数
import requests
机器学习相关函数
import sklearn
我之所以要在这写下一堆的 import
但一个具体函数也不写,其实就是为了表达, 函数
是非常强大的!
import math
math.pow(3,4)
import math
只要在文件开头写一遍,不用每次调用都写一个importmath.pow()
中间有个点 ,表示 模块
.函数
, 调用模块下的函数不要忘记模块名
print
len
等函数不需要写模块名math.ldexp(5,5)
)
”python 函数名“
( python math.ldexp
)函数
让我们的能力无限扩展随机
是一类非常重要的函数。import random
a = random.randint(0,10)
randint(a,b)
产生一个 这样将会产生一个a到b之间(包括a和b)的随机整数
试一下 在线Python
今晚谁请客怎么实现,假设宿舍有5个人,编号1,2,3,4,5
参数
请用逗号隔开)时间类的函数也非常常用,它们在 time
模块下
import time
时间戳函数
t = time.time()
所以,每次调用time.time()得到的数值不一样(赶紧试下)
试一下 在线Python
年月日时间
t = time.time()
t1 = time.localtime(t)
#time.struct_time(tm_year=2016, tm_mon=11, tm_mday=30, tm_hour=14, tm_min=12, tm_sec=49, tm_wday=2, tm_yday=335, tm_isdst=0)
year = t1.tm_year
month = t1.tm.mon
易错点:注意t1 和 tm_year之间的点,这个点表示的是 t1 结构下的 tm_year(先学会这么用,后面细讲 )
试一下 在线Python
非常有意思的 sleep
函数
time.sleep(1)
调用time.sleep(1)
会让程序睡1s;(就是停1s再运行下面的语句)
比如:
t = time.time()
print(t)
t = time.time()
print(t)
这个程序,很大概率输出的t是同一秒的时间戳
t = time.time()
print(t)
time.sleep(1)
t = time.time()
print(t)
自定义函数
print
abs
math.pow
time.time
random.randint
等等的系统函数的还记得 代码块
吗?
在1-4章里所有 代码块
都是特定的功能代码(不就是运算吗), 比如:
...
...
#代码块
...
#代码块
...
有这种情况吧, 其实所有代码块都可以写成自定义函数
def
(其实就是英文define定义的缩写),表示定义一个函数参数
,对应的其实就是 代码块
的输入
return 返回值
;这里的 返回值
其实就是 代码块
的输出
举栗子更好:(定义一个自己的abs函数 [绝对值])
def my_abs(a):
jueduizhi = a
if a < 0:
jueduizhi = -a
return jueduizhi
易错点:def后面要空格
易错点:注意这个函数的return,是return计算完的绝对值
现在来调用这个自己的函数my_abs ;
一定要自己在线运行一下。
代码块
就是计算绝对值的,那么刚开始的例子可以改成
...
...
my_abs(a)
...
my_abs(a)
...
想一下,原来用代码块
和现在用函数调用,显然是函数调用更清晰,更不容易出错。
现在我们定义一个sayhello
函数, 我们来看看另外几个易错点
def sayhello():
print('hello world')
sayhello()
试一下 在线Python
def sayhello():
print('hello world')
试一下 在线Python
def sayhello():
print('hello world')
sayhello()
sayhello()
试一下 在线Python
现在思考一下:sayhello
函数的输出是什么?(返回值是什么)
易错点:这个不会输出两个 ‘hello world’ 也不是输出一个 ‘hello world';而是输出 ‘hello world' ’None' 为什么?
s = sayhello()
的时候,会执行sayhello 里的运算,其实就是输出 ‘hello world'None
(None
是python里的一种数据,后面细讲)现在 变量 s 等于这个返回值 None,于是print(s) 会打印输出 'None'
我们改一下:
思考一下:输出什么?(答案:‘hello world')
s = sayhello()
的时候,s就等于了 ’hello world'
函数
其实没有什么综合运用,就是把上一章的地铁2号线代码,用自定义函数实现一次!
”前门“ 1号
,”崇文门“ 2号
...环线最优路径算法
start
end
输出 fangxiang
zou_num
代码块
定义成函数:def huanxian(start_num, end_num):
fangxiang = ''
zou_num = 0
#待实现
return (fangxiang,zou_num) #可以同时返回两个变量哦~
def say_dangqian():
print("现在出站")
"问路回答法"
def huida(fangxiang, zou_num):
#待实现
现在来写主程序( 特别短,很好读)
start = '?' #具体执行时填写
start_num = ? #具体执行时填写
end = '?' #具体执行时填写
end_num = ? #具体执行时填写
fangxiang = ''
zou_num = 0
if start_num == end_num:
say_dangqian()
(fangxiang,zou_num) = huanxian(start_num, end_num)
huida(fangxiang, zou_num)
实现以下回答算法
def huida(fangxiang, zou_num):
#待实现
a = 0
while a < zou_num:
print(fangxiang+'走1站') #一定要4个空格
a = a + 1
实现以下环线算法(中间用到abs函数)
def huanxian(start_num, end_num):
fangxiang = ''
zou_num = 0
#环线最优路径算法
default = end_num - start_num #默认
jueduizhi = abs(default) #默认绝对值
duiying = 18 - jueduizhi #对应的绝对值
if default > 0:
duiying = -duiying #反方向
j1 = abs(default)
j2 = abs(duiying)
zuiyou = 0
if j1 < j2:
zuiyou = default
if j2 < j1:
zuiyou = duiying
if zuiyou > 0:
fangxiang = '右'
zou_num = zuiyou
if zuiyou < 0:
angxiang = '左'
zou_num = -zuiyou
return (fangxiang, zou_num)
试一下 在线Python
fangxiang
zou_num
函数
的知识,不用担心现在没有完全理解~p4 知识点总结: