- 我的编程之路
- 函数调用
- 数学函数
- 布尔函数
- 自定义函数和使用
- 增量式开发
- 组合式开发
- 运行流程
- 形式参数和实际参数
- 函数内部变量和形参都是局部的
- 函数的使用意义
- 函数术语
从玩耍Excel表格到MySQL数据仓库,之后进入数据分析的天坑,然后再到大数据平台HIVE、Hbase。接着Django Web全栈开发。在走过这一圈之后,很多的内容学习都是碎片化的,在未来一段时间找几本书籍系统的学习一下,顺便做个笔记给后来的学生。
在编程的语境下,“函数”这个词的意思是对一系列语句的组合,这些语句共同完成一种运算。定义函数需要给函数指定一个名字,另外还好写出这些进行运算的语句。定义完成后,就可以通过函数名来“调用”函数。
函数调用Python提供了一些转换数值类型的函数。
- 函数名:type
- 参数:10
- 结果:返回 type 定义的函数类型
>>> type(10)
但是并不是什么数据类型都能转换,需要确保被转换的数据类型合法,换句话理解为可以是真实存在的。
- 字符串不能转换成整数类型
>>> int('32')
32
>>> int('Hello')
ValueError: invalid literal for int(): Hello
- int这个函数能把浮点数转成整型
>>> int(1.91) 1 >>> int(-1.3) -1
- float能把整型和字符串转变成浮点数
>>> float(12)
12.0
>>> float('3.14159')
3.14159
- str字符串类型转换
>>> str(12) '12' >>> str(3.14159) '3.14159'数学函数
数据函数模块是Python内置,提供了绝大多数数学方面的计算公示并封装成了函数。
实用数学函数之前必须进行加载导入
>>> import math >>> math
- 对数函数
>>> ratio = 0.5 >>> ratio_result = 10 * math.log10(ratio) -3.010299956639812
- 正弦函数
>>> ratio = 0.7 >>> sin_reslut = math.sin(ratio) 0.644217687237691
- 圆周率计算
>>> radians = 45/ 180.0 * math.pi >>> math.sin(radians) 0.707106781187
- 组合数学公式
x = math.sin(45/ 360.0 * 2 * math.pi) x = math.exp(math.log(x+1))布尔函数
- 函数也可以返回布尔值,这种情况便于隐藏函数内部的复杂测试
def is_divisible(x, y):
if x % y == 0:
return True
else:
return False
- 布尔函数起个独特的名字标识要有判断意味的提示
>>> is_divisible(6, 4) False >>> is_divisible(6, 3) True
- 布尔函数经常用于条件语句
if is_divisible(x, y):
print('x is divisible by y')
# 等价于
if is_divisible(x, y) == True:
print('x is divisible by y')
自定义函数和使用
- 标准格式
函数名后面的括号是空的,意思是这个函数不需要参数。
def 函数名(参数): 函数要执行的语句
- 函数的无返回值
def print_lyrics():
print("请你在我怀里一起生活吧。")
print("做着美梦 在梦里不知不觉。")
def repeat_lyrics():
print_lyrics()
repeat_lyrics()
请你在我怀里一起生活吧。
做着美梦 在梦里不知不觉。
- 函数的有返回值
def get_lyrics():
data = "请你在我怀里一起生活吧。"
return data
lyrics = get_lyrics()
请你在我怀里一起生活吧。
增量式开发
写一些复杂函数的时候,你会发现要花很多时间调试。不如将所有的内容整合刀一个函数里进行增量式的代码编写节省时间,并且逻辑更加清楚。
- 进行一个距离公式的计算
def distance(x1, y1, x2, y2):
dx = x2 - x1
dy = y2 - y1
dsquared = dx**2 + dy**2
result = math.sqrt(dsquared)
return result
如果你能看懂代码就一定知道这是一个欧式距离的计算公式
d i s t a n c e = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 distance = sqrt{(x_2 − x_1)^2 + (y_2 − y_1)^2} distance=(x2−x1)2+(y2−y1)2
用代码来实现了这个公式的计算。
组合式开发例如现在有个问题,函数需要两个点,一个是圆心,一个是圆周上面的点,函数要用来计算这个圆的面积。
需要
def area(radius):
a = math.pi * radius**2
return a
def circle_area(xc, yc, xp, yp):
radius = distance(xc, yc, xp, yp)
result = area(radius)
return result
# 等价于
def circle_area(xc, yc, xp, yp):
return area(distance(xc, yc, xp, yp))
运行流程
为了确保一个函数在首次被调用之前已经定义,你必须要之道语句运行的顺序,也就是所谓『运行流程』。
一个Python程序都是从第一个语句开始运行的。从首至尾,每次运行一个语句。
函数的定义并不会改变程序的运行流程,但要注意,函数体内部的语句只有在函数被调用的时候才会运行。
函数调用就像是运行流程有了绕道的行为。没有直接去执行下一个语句,运行流跳入到函数体内,运行里面的语句,然后再回来从离开的地方继续执行。
总的来说,你阅读一个程序的时候,并不一定总是要从头到尾来读的。有时候你要按照运行流程来读才更好理解。
形式参数和实际参数实际参数就是调用函数时候传给他的那个参数,而形式参数可以理解为函数内部定义用的参数。
- 实际参数会被赋值给形式参数
def print_(data):
print(data)
print(data)
>>> print_twice(42)
42
42
# data 形式参数
# 42 实际参数
- 内置函数的组合规则的自定义的函数
# 定义函数
def print_(data):
print(data)
print(data)
# 调用函数
>>> print_(math.cos(math.pi))
-1.0
-1.0
# 等价于
data = math.cos(math.pi)
>>> print_(data)
-1.0
-1.0
函数内部变量和形参都是局部的
在函数内部建立一个变量,这个变量是仅在函数体内部才存在。
def print_(data):
print(data)
print(data)
def data_twice(part1, part2):
part = part1 + part2
print_(part)
>>> data1= 'hello'
>>> data2= 'python.'
>>> data_twice(data1, data2)
hello python.
hello python.
执行完毕之后 我们调用part会提示未定义
>>> print(part) NameError: name 'part' is not defined函数的使用意义
- 创建一个新的函数,可以把一组语句用一个名字来命名,这样你的程序读起来就清晰多了,后期维护调试也方便。
- 函数的出现能够避免代码冗余,程序内的一些重复的内容就会简化了,变得更小巧。而且在后期进行修改的时候,你只要改函数中的一处地方就可以了,很方便。
- 把长的程序切分成一个个函数,你就可以一步步来debug调试,每次只应对一小部分就可以,然后把它们组合起来就可以用了。
- 精细设计的函数会对很多程序都有用处。一旦你写好了并且除了错,这种函数代码可以再利用。
- 函数(function):一系列有序语句的组合,有自己的名字,并且用在某些特定用途。可以要求输入参数,也可以没有参数,可以返回值,也可以没有返回值。
- 函数定义(function definition):创建新函数的语句,确定函数的名字,形式参数,以及函数内部的语句。
- 函数对象(function object):由函数定义所创建的值,函数名字指代了这一函数对象。
- 函数头(header):函数定义的第一行。
- 函数体(body):函数定义内部的一系列有序语句。
- 形式参数(parameter):用来在函数内部接收实际参数传来的值,并被函数在函数内部使用。
- 函数调用(function call):运行某个函数的语句。包括了函数的名字以及括号,括号内放函数需要的实际参数。
- 实际参数(argument):当函数被调用的时候,提供给函数的值。这个值会被函数接收,赋给函数内部的形式参数。
- 局部变量(local variable):函数体内定义的变量。局部变量只在函数内部有效。
- 返回值(return value):函数返回的结果。如果一个函数调用被用作了表达式,这个返回值就是这个表达式所代表的值。
- 有返回值函数(fruitful function):返回一个值作为返回值的函数。
- 无返回值函数(void function):不返回值,只返回一个空None的函数。
- 空值(None):无返回值函数所返回的一种特殊的值。
- 模块(module):包含一系列相关函数以及其他一些定义的文件。
- 导入语句(import statement):读取模块并且创建一个模块对象的语句。
- 模块对象(module object):导入语句创建的一个值,允许访问模块所定义的值。
- 点符号(dot notation):调用某一个模块的某一函数的语法形式,就是模块名后加一个点,也就是英文的句号,再加函数名。
- 组合(composition):把表达式作为更大的表达式的一部分,或者把语句作为更大语句的一部分。
- 运行流程(flow of execution):语句运行的先后次序。
- 栈图(stack diagram):对函数关系、变量内容及结构的图形化表示。
- 框架(frame):栈图中的方框,表示了一次函数调用。包括函数的局部变量和形式参数。
- 追踪(traceback):对运行中函数的列表,当有异常的时候就会输出。
- 临时变量(temporary variable):用来在复杂运算过程中存储一些中间值的变量。
- 无效代码(dead code):一部分不会被运行的代码,一般是书现在了返回语句之后。
- 渐进式开发(incremental development):程序开发的一种方式,每次对已有的能工作的代码进行小规模的增补修改来降低调试的精力消耗。
- 脚手架代码(scaffolding):在程序开发期间使用的代码,但最终版本并不会包含这些代码。
- 守卫(guardian):一种编程模式。使用一些条件语句来检验和处理一些有可能导致错误的情况。



