Python程序设计之 函数和代码复用

  1 函数的定义与使用

  函数可以有参数,也可以没有,但必须保留括号:

  def <函数名>(<参数(0个或多个)>) :

  <函数体>

  return <返回值>

  1.1 函数的参数传递

  可选参数传递:函数定义时可以为某些参数指定默认值,构成可选参数

  def <函数名>(<非可选参数>, <可选参数>) :

  <函数体>

  return <返回值>

  >>> def fact(n, m = 1):

  s = 1

  for i in range(1, n + 1):

  s *= i

  return s//m

  >>> fact(10)

  3628800

  >>> fact(10, 5)

  725760

  可变参数传递:函数定义时可以设计可变数量参数,使用 *b 实现

  def <函数名>(<参数>, *b) :

  <函数体>

  return <返回值>

  >>> def fact(n, *b):

  s = 1

  for i in range(1, n + 1):

  s *= i

  for item in b:

  s *= item

  return s

  >>> fact(5, 2)

  240

  >>> fact(5, 2, 2, 5)

  2400

  参数传递两种方式:函数调用时,参数可以按照位置或名称方式传递

  >>> def fact(n, m=1):

  s = 1

  for i in range(1, n + 1):

  s *= i

  return s//m

  >>> fact(10, 5)

  725760

  >>> fact(m = 5, n = 10)

  725760

  1.2 函数的返回值

  函数可以返回 0个或多个结果

  return 保留字用来传递返回值

  函数可以有返回值,也可以没有,可以有 return,也可以没有

  >>> def fact(n, m = 1):

  s = 1

  for i in range(1, n + 1):

  s *= i

  return s//m, n, m

  >>> fact(10, 5)

  (725760, 10, 5)

  >>> a, b, c = fact(10, 5)

  >>> print(a, b, c)

  725760 10 5

  1.3 局部变量和全局变量

  局部变量是函数内部的占位符,与全局变量可能重名但不同

  函数运算结束后,局部变量被释放

  可以使用 global 保留字在函数内部使用全局变量

  局部变量为组合数据类型且未创建,等同于全局变量

  1.4 lambda函数

  lambda 函数是一种匿名函数,即没有名字的函数

  使用 lambda 保留字定义,函数名是返回结果

  lambda 函数用于定义简单的、能够在一行内表示的函数

  example:

  >>> f = lambda x, y : x + y

  >>> f(10, 15)

  25

  >>> f = lambda : "lambda函数"

  >>> print(f())

  lambda函数

  2 实例: 七段数码管绘制

  步骤1:绘制单个数字对应的数码管

  步骤2:获得一串数字,绘制对应的数码管

  步骤3:获得当前系统时间,绘制对应的数码管

  import turtle, time

  def drawGap(): #绘制数码管间隔

  turtle.penup()

  turtle.fd(5)

  def drawLine(draw): #绘制单段数码管

  drawGap()

  turtle.pendown() if draw else turtle.penup()

  turtle.fd(40)

  drawGap()

  turtle.right(90)

  def drawDight(dight): #根据数字绘制七段数码管

  drawLine(True) if dight in [2,3,4,5,6,8,9] else drawLine(False)

  drawLine(True) if dight in [0,1,3,4,5,6,7,8,9] else drawLine(False)

  drawLine(True) if dight in [0,2,3,5,6,8,9] else drawLine(False)

  drawLine(True) if dight in [0,2,6,8] else drawLine(False)

  turtle.left(90)

  drawLine(True) if dight in [0,4,5,6,8,9] else drawLine(False)

  drawLine(True) if dight in [0,2,3,5,6,7,8,9] else drawLine(False)

  drawLine(True) if dight in [0,1,2,3,4,7,8,9] else drawLine(False)

  turtle.left(180)

  turtle.penup()

  turtle.fd(20)

  def drawDate(data): #data为日期,格式为 '%Y-%m=%d+'

  turtle.pencolor("red")

  for i in data:

  if i == '-':

  turtle.write("年", font = ("Arial", 18, "normal"))

  turtle.pencolor("green")

  turtle.fd(40)

  elif i == '=':

  turtle.write("月", font = ("Arial", 18, "normal"))

  turtle.pencolor("green")

  turtle.fd(40)

  elif i == '+':

  turtle.write("日", font = ("Arial", 18, "normal"))

  else:

  drawDight(eval(i)) #通过eval()函数将数字变为整数

  def main():

  turtle.setup(800, 350, 200, 200)

  turtle.penup()

  turtle.fd(-300)

  turtle.pensize(5)

  drawDate(time.strftime("%Y-%m=%d+", time.gmtime()))

  turtle.hideturtle()

  turtle.done()

  main()

  运行结果:

  3 函数递归

  递推需要递归公式和递归结束条件

  实例1:字符串反转

  def rvs(s):

  if s == "":

  return s

  else:

  return rvs(s[1:]) + s[0]

  实例2:斐波那契数列

  def f(n):

  if n == 1 or n == 2:

  return 1

  else:

  return f(n-1)+ f(n-2)

  实例3:汉诺塔问题

  

在这里插入图片描述

 郑州看妇科哪家医院好 http://www.hnzzkd.com/

  求解过程如下:

  如果 n=1,则将这一个盘子直接从 A 柱移到 C 柱上

  如果 n>1,则执行以下 3 步:

  用 C 柱做缓冲,将 A 柱上的 (n-1) 个盘子移到 B 柱上

  将 A 柱上最后一个盘子直接移到 C 柱上。

  用 A 柱做缓冲,将 B 柱上的 (n-1) 个盘子移到 C 柱上。

  count = 0

  def hanoi(n, src, dst, mid):

  global count

  if n == 1:

  print("{}:{}->{}".format(1, src, dst))

  count += 1

  else:

  hanoi(n-1, src, mid, dst)

  print("{}:{}->{}".format(n, src, dst))

  count += 1

  hanoi(n-1, mid, dst, src)

  hanoi(3, "A", "C", "B")

  print(count)

  4 PyInstaller 库的使用

  功能:PyInstaller 库可以将 .py 源代码转换成无需源代码的可执行文件

  PyInstaller 库的安装:(cmd 命令行) pip install pyinstaller

  简单的使用:(cmd 命令行) pyinstaller -F <文件名.py>

  常用参数:

  参数  描述

  -h  查看帮助

  –clean  清理打包过程中的临时文件

  -D, --onedir  默认值,生成dist文件夹

  -F, --onefile  在dist文件夹中只生成独立的打包文件

  -i <图标文件名.ico>  指定打包程序使用的图标(icon)文件

  example:使用图标 curve.ico 作为可执行文件的图标

  pyinstaller –i curve.ico –F SevenDigitsDrawV2.py

  5 实例: 科赫雪花小包裹

  import turtle

  def koch(size, n):

  if n == 0: # 0阶时是一条直线

  turtle.fd(size)

  else: # 多阶时,分别针对4段绘制n-1阶科赫曲线

  for angle in [0, 60, -120, 60]:

  turtle.left(angle)

  koch(size/3, n-1)

  def main():

  turtle.setup(600, 600)

  turtle.penup()

  turtle.goto(-200, 100)

  turtle.pendown()

  turtle.pensize(2)

  level = 3

  koch(400, level)

  turtle.right(120)

  koch(400, level)

  turtle.right(120)

  koch(400, level)

  turtle.hideturtle()

  main()

  运行结果:

  6 小结

  函数的定义与使用

  使用保留字 def 定义函数,lambda 定义匿名函数

  可选参数(赋初值)、可变参数 (*b)、名称传递

  保留字 return 可以返回任意多个结果

  保留字 global 声明使用全局变量,一些隐式规则

posted @ 2020-04-02 15:32  tiana_Z  阅读(314)  评论(0编辑  收藏  举报