组合
编辑语言最有用的特征之一,是能够将小块的构建材料组合在一起。例如,函数的实参可以是任意类型的表达式,包括算数运算符,也可以是函数调用
x = math.sin(degrees/360.0*2*math.pi)
x = math.exp(math.log(x+1))
几乎所有可以放值的地方都可以放一个任意类型的表达式,只有一个例外
赋值语句的左侧必须是一个变量名,左侧放其他任何表达式都会产生语法错误
新建函数
一个函数的定义,指定了新函数的名称以及当函数被调用时执行的语句序列
def myprint():
print("hello world")
def关键字标明是函数定义,函数名是myprint
函数定义的第一行被称作函数头,其余部分被称作函数体,函数头必须以冒号结尾,函数体必须缩进。
单引号和双引号的作用相同,当字符串中存在单引号时,只能使用双引号
如果在交互模式下键入函数定义,每空一行解释器就会打印三个据点,让你知道定义并没有结束
为了结束定义,必须输入一个空行
定义一个函数会创建一个函数对象,其类型是function
一旦定义了一个函数就可以在另一个函数中使用它
def repeat():
myprint()
定义和使用
函数定义作用是创建函数对选哪个,函数内部的语句在函数被调用之前是不会被识别的,函数定义不会产生任何输出
函数定义必须在函数第一次被调用之前执行
执行流程:
语句执行的顺序
形参和实参
在函数内部,实参被赋给称作形参的变量
def myprint(a):
print(a)
myprint(3)
#3就是实参,a是形参
myprint('a'*4)
#组合规则
变量和形参都是局部的
当在函数里创建变量是,这个变量是局部的,也就是说它只在函数内部存在
堆栈图
用于跟踪哪个变量在哪能用
每个函数用一个栈帧表示
函数调用发生错误是,python会打印出错函数的名字以及调用它的函数的名字,一直追溯到main为止
打印出的函数列表被称为回溯,它会告诉你发生错误的是哪个程序文件,错误在哪一行,以及当时正在执行的函数,它还会显示引起错误的那一行代码
回溯中的函数顺序,与堆栈图中的函数顺序一致,出错是正在运行的内个函数则位于回溯信息的底部
有返回值函数和无返回值函数
如果试图将无返回值函数的结果赋给一个变量,会得到一个被称作None的特殊值
None是一个有自己独立类型的特殊值
1.python提供了一个内置函数,叫len,可以返回一个字符串的长度
2.print函数默认会自动转行,但是在行尾加一个空格就可以阻止
print('+',end=' ')
案例研究:接口设计
turtle模块
import turtle
bob = turtle.Turtle()
#导入turtle模块
print(bob)
turtle.mainloop()
turtle模块提供了一个叫做Turtle的函数,这个函数会创建一个Turtle对象,我们将其赋值给名为bob的变量
bob指向一个Turtle类型的对选哪个这个类型是由turtle模块定义的
创建一个Turtle对象之后,可以调用方法,来在窗口移动该对象
例,让海龟向前走
bob.fd(100)
fd方法的实参是像素距离,所以前进的距离取决于屏幕
Turtle对象中能调用的其他方法还包括,让它向后走的bk,向左转的lt,向右转的rt。lt和rt这两个方法接受的实参是角度
另外每个Turtle都握着一支笔,不是落笔就是抬笔,如果落笔了,Turtle就会在移动时留下痕迹。pu和pd这两个方法就分别代表了抬笔和落笔
如果要画一个直角
bob.fd(100)
bob.lt(90)
bob.fd(100)
利用for语句更加简洁的完成任务
for i in range(4):
print(1)
#用for循环实现画一个正方形
for i in range(4):
bob.fd(100)
bob.lt(90)
for语句的语法和函数定义类似。它有一个以冒号结尾的语句头一个一个缩进的语句体。语句体可以包含任意条语句
for语句有时也被称为循环,因为执行流程会贯穿整个语句体,然后再循环回顶部。
封装
def square(t):
for i in range(4):
t.fd(100)
t.lt(90)
square(bob)
泛化
给函数square增加一个length形参
def square(t,length):
for i in range(4):
t.fd(length)
t.lt(90)
square(bob,100)
给函数增加一个形参被称为泛化,因为这使得函数更加的通用,增加length之后就可以改变画出的正方形的大小
画任意多边形
def polygon(t,n,length):
angle = 360/n
for i in range(n):
t.fd(length)
t.lt(angle)
polygon(bob,7,70)
如果一个函数有多个数字形参,很容易忘记顺序,可以将形参名加入实参列表
polygon(bob,n=7,length=70)
这些被称为关键字实参,因为加入了形参名
接口设计
import math
def circle(t,r):
circumference = 2*math.pi*r
n = 50
length = circumference / n
polygon(t,n,length)
函数第一行通过半径计算周长,然后计算每一边的边长,画出五十边型,近似为圆
但是n是一个固定的值,不能适应r的变化,但是n不适合作为画圆的接口,所以在函数内利用周长选择一个合适的n值
def circle(t,r):
circumference = 2*math.pi*r
n = int(circumference/3) + 1
length = circumference / n
polygon(t,n,length)