https://i.cnblogs.com/settings

函数的使用与实例(七段数码管绘制)

-函数的理解与定义
-函数的使用及调用过程
-函数的参数传递
-函数的返回值
-局部变量和全局变量
-lambda函数

函数的理解和定义

#DayDayUpQ4.py
def dayUP(df):
    dayup= 1
    for i in range(365):
        if i % 7 in[6,0]:
            daup= dayup*(1 -0.01)
        else:
            dayup= dayup*(1 + df)
    return dayup
dayfactor= 0.01
while dayUP(dayfactor) < 37.78:
    dayfactor+= 0.001
print("工作日的努力参数是:{:.3f}".format(dayfactor))    

  

函数的定义

def <函数名> (<参数(0个或多个)>):
  <函数体>
  return<返回值>

计算n!
def fact(n) :   #fact(函数名)   n(参数)
    s = 1
    for i in range(1, n+1):
        s *= i
    return s    #返回值

  

函数的调用

def fact(n) :         #函数的定义
    s = 1
    for i in range(1, n+1):
        s *= i
    return s
fact(10)           #函数的调用

 函数的调用过程

 

参数个数

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

def<函数名>():
  <函数体>
  return<返回值>

def fact() :
print("我也是函数")

 

可选参数传递

def<函数名>(<非可选参数>,<可选参数>):
  <函数体>
  return<返回值>

计算n!//m
def fact(n,m=1) :    #可选参数(m)
    s = 1
    for i in range(1, n+1):
        s *= i
    return s//m

>>>fact(10)
3628800
>>>fact(10,5)
725760

可变参数传递

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

  <函数体>
  return<返回值>

可变参数传递
计算n!乘数
def fact(n, *b) :        #可变参数(b)
    s = 1
    for i in range(1, n+1):
        s *= i
    for item in b:
        s *= item
    return s

>>>fact(10,3)
10886400
>>>fact(10,3,5,8)
435456000

参数传递的两种方式

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

  

函数的返回值

-return保留字用来传递返回值
-函数可以有返回值,也可以没有,可以有return,也可以没有
-return可以传递0个返回值,也可以传递任意多个返回值

函数调用时,参数可以按照位置或名称方式传递
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

 

局部变量和全局变量

局部变量和全局变量
n, s = 10, 100    #n和s是全局变量
def fact(n) :
    s = 1                 #fact()函数中的n和s是局部变量
    for i in range(1, n+1):
        s *= i
    return s
print(fact(n), s)

运行结果
>>>
3628800 100 

规则1: 局部变量和全局变量是不同变量
-局部变量是函数内部的占位符,与全局变量可能重名但不同
-函数运算结束后,局部变量被释放
-可以使用global保留字在函数内部使用全局变量

局部变量和全局变量
n, s = 10, 100
def fact(n) :                    #fact()函数中使用global保留字声明此处s是全局变量s
    global s
    for i in range(1, n+1):
        s *= i
    return s                       #此处s指全局变量s
print(fact(n), s)               #此处全局变量s被函数修改

运行结果
>>>
362880000 362880000
局部变量和全局变量
n, s = 10, 100             # fact()函数中使用global保留字声明此处s是全局变量s
def fact(n) :
    global s
    for i in range(1, n+1):
        s * = i
    return s                   #此处s指全局变量s
print(fact(n), s)            # 此处全局变量s被函数修改

运行结果
>>>
362880000 362880000

  

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

ls = ["F", "f"]           #通过使用[]真实创建了一个全局变量列表ls
def func(a) :             #此处ls是列表类型,未真实创建
    ls.append(a)          #则等同于全局变量
    return
func("C")                 #全局变量ls被修改
print(ls)

运行结果
>>>
['F', 'f', 'C']
ls = ["F", "f"]           #通过使用[]真实创建了一个全局变量列表ls
def func(a) :             #此处ls是列表类型,真实创建
    ls = []               #ls是局部变量
    ls.append(a)
    return
func("C")                 #局部变量ls被修改
print(ls)

运行结果
>>>
['F', 'f']

 

lambda函数

-lambda函数是一种匿名函数,即没有名字的函数
-使用lambda保留字定义,函数名是返回结果
-lambda函数用于定义简单的、能够在一行内表示的函数

方法一:<函数名>=lambda<参数>:<表达式>

方法二:def<函数名>(<参数>):
      <函数体>
      return<返回值>

>>>f = lambda x, y : x + y
>>>f(10, 15)
25
>>>f = lambda: "lambda函数"
>>>print(f())
lambda函数

 

实例:七段数码管绘制(上)

基本思路
-步骤1:绘制单个数字对应的数码管
-步骤2:获得一串数字,绘制对应的数码管
-步骤3:获得当前系统时间,绘制对应的数码管

 1 import turtle
 2 def drawLine(draw): #绘制单段数码管
 3     turtle.pendown() if draw else turtle.penup()
 4     turtle.fd(40)
 5     turtle.right(90)
 6 def drawDigit(digit): #根据数字绘制七段数码管
 7     drawLine(True) if digit in[2,3,4,5,6,8,9] else drawLine(False)
 8     drawLine(True) if digit in[0,1,3,4,5,6,7,8,9] else drawLine(False)
 9     drawLine(True) if digit in[0,2,3,5,6,8,9] else drawLine(False)
10     drawLine(True) if digit in[0,2,6,8] else drawLine(False)
11     turtle.left(90)
12     drawLine(True) if digit in[0,4,5,6,8,9] else drawLine(False)
13     drawLine(True) if digit in[0,2,3,5,6,7,8,9] else drawLine(False)
14     drawLine(True) if digit in[0,1,2,3,4,7,8,9] else drawLine(False)
15     turtle.left(180)
16     turtle.penup() #为绘制后续数字确定位置
17     turtle.fd(20) #为绘制后续数字确定位置
18 def drawDate(date): #获得要输出的数字
19     for i in date:
20         drawDigit(eval(i)) #通过eval()函数将数字变为整数
21 def main():
22     turtle.setup(800, 350, 200, 200)
23     turtle.penup()
24     turtle.fd(-300)
25     turtle.pensize(5)
26     drawDate('20181010')      #输出显示的数字
27     turtle.hideturtle()
28     turtle.done()
29 main()

实例:七段数码管绘制(下)

基本思路
-步骤1:绘制单个数字对应的数码管
-步骤2:获得一串数字,绘制对应的数码管
-步骤3:获得当前系统时间,绘制对应的数码管

 1 # 绘制七段数码管并显示时间(本地)
 2 # I:数字形式的字符串(日期)
 3 # P:根据数字绘制数码管
 4 # O:绘制当前日期形式的七段数码管
 5 
 6 import turtle, datetime
 7 
 8 def DrawGap():
 9     # 数码管间间隔绘制
10     turtle.penup()
11     turtle.fd(5)
12 
13 def DrawLine(draw):
14     # 绘制单段数码管
15     DrawGap()
16     turtle.pendown() if draw else turtle.penup()
17     turtle.fd(40)
18     DrawGap()
19     turtle.right(90)
20 
21 def DrawDight(digit):
22     # 根据数字绘制七段数码管
23     # 先绘制下半段
24     DrawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else DrawLine(False)
25     DrawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else DrawLine(False)
26     DrawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else DrawLine(False)
27     DrawLine(True) if digit in [0, 2, 6, 8] else DrawLine(False)
28     # 再绘制上半段
29     turtle.left(90)
30     DrawLine(True) if digit in [0, 4, 5, 6, 8, 9] else DrawLine(False)
31     DrawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else DrawLine(False)
32     DrawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else DrawLine(False)
33     turtle.left(180)
34     turtle.penup()
35     turtle.fd(20)
36 
37 def DrawDate(date):
38     # 获得需要输出的数字
39     turtle.pencolor("red")
40     for i in date:
41         if i == '-':  # '-'替换 '年'
42             turtle.write('', font=("Arial", 18, "normal"))
43             turtle.pencolor("green")
44             turtle.fd(40)
45         elif i == '=':  # '=' 替换 '月'
46             turtle.write('', font=("Arial", 18, "normal"))
47             turtle.pencolor("blue")
48             turtle.fd(40)
49         elif i == '+':  # '+'替换 '日'
50             turtle.write('', font=("Arial", 18, "normal"))
51         else:
52             DrawDight(eval(i))  # eval传递值,而不是字符串
53 
54 def main():
55     turtle.setup(800, 350, 200, 200)
56     turtle.penup()
57     turtle.fd(-300)
58     turtle.pensize(5)
59 
60     # DrawDate('123456')
61     DrawDate(datetime.datetime.now().strftime('%Y-%m=%d+'))  # 绘制时间段,定义格式
62     turtle.hideturtle()
63 
64 main()

 

posted @ 2019-11-13 11:36  LLLN  阅读(729)  评论(0)    收藏  举报
Copyright © 2021 llln Powered by .NET 5.0 on Kubernetes