11 - 函数

1 . 函数的概念

如果在开发程序时,某块代码需要多次调用或者复用性高,为了提高编写的效率以及代码的重用,把具有独立功能的代码块组织为一个小模块,这就是函数

2 . 函数的定义和调用

  • 定义函数的格式:
//使用def定义函数
    def 函数名():
        代码

demo:

def print_triangle():
    print("*")
    print("*"*2)
    print("*"*3)
    print("*"*4)
  • 函数的调用格式:
函数名()

demo:

//定义完函数后,函数是不会自动执行的,需要手动调用
print_triangle()

3 . 函数的类型

3.1 无参数,无返回值

使用场景:打印提示类似的功能

def test():
    print("====")
test()  #调用之后便会打印====
3.2 无参数,有返回值的函数

使用场景:保存数据

def getsum():
    return  100
temp = getsum()
print("当前数值为:%d"%(temp)) #当前数值为:100

3.3有参数,无返回值

使用场景:以需求为主

//定义带有参数的函数
def test(a,b): 
     print("%d"%(a + b))
#调用带有参数的函数(调用时,需要在小括号中,传递数据)
test(11,123) #134
gif显示.gif
3.4 有参数,有返回值

使用场景:像数据处理并需要结果的应用

** 就是程序中函数完成一件事情后,最后给调用者的结果**
demo1:

#定义函数
def sum(a,b):
    return  a + b
#调用函数,顺便保存函数的返回值,再打印
print("sum = %d"%(sum(11,11))) #sum = 22

demo2:求和以及求平均值

def sumNum(num):
    result = 0
    i = 1
    while i<= num:
        result = result + i
        i+=1
    return result

r = sumNum(100)
print("1-50的和为:%d"%(r)) #1-50的和为:5050

def sum3Num(a,b,c):
    return a +b + c
def aveeage3Num(a,b,c):
    sumResult = sum3Num(a,b,c)
    result = sumResult /3
    return  result
r = aveeage3Num(11,12,13)
print("三个数的平均值:%d"%(r)) #三个数的平均值:12

函数的嵌套使用(打印5行-----)

  • 笨方式demo
def print_line():
    print("-"*5)
def print_5_line():
    print("-" * 5)
    print("-" * 5)
    print("-" * 5)
    print("-" * 5)
    print("-" * 5)
print_5_line()

  • 优雅方式

def print_line():
    print("-"*5)
def print_5_line():
     i= 0
     while i < 5:
       print_line()
       i += 1
print_5_line()

** 小总结 **

  • 定义时小括号中的参数,用来接收参数用的,称为 “形参”
  • 调用时小括号中的参数,用来传递给函数用的,称为 “实参”

4. 局部变量与全局变量

4.1 局部变量
  • 局部变量:定义在函数内部的变量
  • 部变量的作用:临时保存数据需要在函数中定义变量来进行存储
  • 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
4.2 全局变量
  • 在函数外边定义的变量

  • 全局变量能够在所有的函数中进行访问

  • 如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错

  • 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇

  • 在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。

  • 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。

  • 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量。

demo

aa = 10
def test1():
    print(aa)
def test2():
    print(aa)
test1() 
test2()
运行结果:
10
10

** 修改全局变量**

aa = 10
def test1():
    aa = 100
    print('test1修改前:aa = %d'%(aa))
    global  aa
    aa = 111
    print('test1修改后:aa = %d' % (aa))

def test2():

    print('test2:aa = %d' % (aa))
test1()
test2()

打印结果:

Snip20170617_2.png

5. 递归函数

5.1 什么是递归函数

如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。

  • 计算阶乘n! = 1 * 2 * 3 * ... * n
    方式一(使用while方式):
def sumNumber(num):
    i = 1
    result = 1
    while i<= num:
        result *=i
        i+=1
    return result

result = sumNumber(4)
print(result)

阶乘的规律

1! = 1
2! = 2 × 1 = 2 × 1!
3! = 3 × 2 × 1 = 3 × 2!
4! = 4 × 3 × 2 × 1 = 4 × 3!
...
n! = n × (n-1)!

方式二(使用递归方式):

def sumNumber1(num):
    if num >1:
        result = num * sumNumber1(num -1)
    else:
        result = 1
    return  result
result1 = sumNumber1(4)
print(result1) #24


6. 匿名函数

6.1 什么是匿名函数
  • lambda关键词能创建小型匿名函数,这种函数省略了用def声明函数的标准步骤

  • lambda函数能接收任何数量的参数但只能返回一个表达式的值

  • 匿名函数不能直接调用print,因为lambda需要一个表达式

6.2语法
    lambda [arg1 [,arg2,.....argn]]:expression
6.3 demo
#函数作为参数传递
def fun(a,b,c):
    print("a= %d"%a)
    print("a= %d" %b)
    print("result = %d"%c(a,b))
f = fun(5,2,lambda x,y:x+y)
#作为内置函数的参数
student = [
    {"name":"zhangsan", "age":18},
    {"name":"lisi", "age":19},
    {"name":"wangwu", "age":17}
            ]
# 按name排序:
student.sort(key = lambda x:x['name'])

print(student)

# 按age排序:
student.sort(key = lambda x:x['age'])
print(student)

打印结果:


Snip20170617_5.png

7. 函数使用注意事项

7.1 自定义函数

  • 无参数、无返回值
 def 函数名():
        语句
  • 无参数、有返回值
    def 函数名():
        语句
        return 需要返回的数值

注意:

一个函数到底有没有返回值,就看有没有return,因为只有return才可以返回数据。
在开发中往往根据需求来设计函数需不需要返回值。
函数中,可以有多个return语句,但是只要执行到一个return语句,那么就意味着这个函数的调用完成。

  • 有参数、无返回值
   def 函数名(形参列表):
        语句

注意:
在调用函数时,如果需要把一些数据一起传递过去,被调用函数就需要用参数来接收
参数列表中变量的个数根据实际传递的数据的多少来确定

  • 有参数、有返回值
    def 函数名(形参列表):
        语句
        return 需要返回的数值

7.2 调用函数

  • 格式
函数名(实参)
  • 调用时,到底写不写 实参
  • 如果在定义时有形参,那么在调用的时候就应该传递参数
  • 调用时,实参的个数和先后顺序应该和定义函数中要求的一致
  • 如果调用的函数有返回值,那么就可以用一个变量来进行保存这个值

7.3 作用域

  • 局部变量:在一个函数中定义的变量,只能在本函数中用
  • 全局变量:在函数外定义的变量,可以在所有的函数中使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1、c语言的函数有以下特点: (1)才源程序由函数组成,一个主函数main()+若干其他函数 C程序中的函数类似文...
    滕王阁序阅读 1,335评论 0 6
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,598评论 1 19
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,513评论 1 51
  • 我们都在生命的浪涛中浮沉过,深谙“能有所享受当然是幸福的,但能够忍受却是另一种胜利”,我们也在百般试炼中体会生...
    和风煦雨阅读 726评论 0 0
  • (002)天意 陈飞也是个老兵,挺喜欢张三的率性,两人聊起军旅故事,就像多年未见的老朋友,陈莉就傻白甜一个,坐一边...
    你咸我淡阅读 234评论 0 2