Python入门笔记—第三章(函数)

第三章:函数基础

1. 函数

1.1 语法

def func():
    func_body
  • def后跟一个空格,冒号不能少,函数的语句首行缩进一致(TAB)

  • 命名需要遵循规则,约定俗成,大驼峰一般用来给类命名

  • 括号里参数可以有也可以没有

1.2 参数及return

参数:(定义同C)

  • 形参:形式参数

  • 实参:实际参数

return:

  • 养成以return为函数结尾的习惯,如果没有return,则默认返回None

  • 函数执行到return语句则无条件返回,不会再继续执行后面的语句

使用函数调用99乘法表实例

def chengfa(row):
    for col in range(1,row+1):
        print( row * col,end = " ")
    print(" ")

for row in range(1,10):
    chengfa(row)

return返回实例

def func(person):
    print("我见到{0}了,但是{1}不理我".format(person,person))
    return "我好失望"
    print("我也见到{0}了,{1}跟我打招呼了".format(person,person))
    return "哈哈"
p = "minjie"
rst = func(p)
print(rst)

1.3 help函数

作用:帮助查看函数文档

如果需要查看Print函数中某个参数的值,则可用:
help(print)

1.4 参数详解

参考资料

Python参考书籍:流畅的Python

参数分类:

  • 普通参数

  • 默认参数

  • 关键字参数

  • 收集参数(包括关键字收集参数)

1.4.1 普通参数

参数的位置和顺序都一一对应

def func(v1,v2):

     语句

调用函数

func(v1,v2)

def func(p1,p2):
    print("我今天遇见{0},{1}跟我打招呼了".format(p1,p2))

func("xiaoming","daming")

1.4.2默认参数

  • 调用的时候形参带有默认值

  • 调动的时候函数没有对应形式参数赋值,则采用默认值

def func(name = "xiaoming",age = 18,sex = "man"):
    if sex == "woman":
        print("hello everyone,I am {0},{1}岁,a cute girl".format(name,age))
    else:
        print("hello everyone,I am {0},{1}岁,a strong boy".format(name,age))

func("woman")

结果:hello everyone,I am xiaoming,18岁,a cute girl

1.4.3 关键字参数

  • 可以不用考虑参数的位置

  • 语法

      def func(p1=v1, p2=v2.....):
          func_body
    
      调用函数:
      func(p1=value1, p2=value2.......)
    

例:

def func(name = "xiaoming",age = 18, hobby = "basketball"):
    print("hello everyone, I am {0},今年{1}岁,我的爱好是{2}".format(name,age,hobby))

func(age = 18,name = "xiaohong")

结果:hello everyone, I am xiaohong,今年18岁,我的爱好是basketball

注:hobby没有赋值,则使用默认参数

1.4.4 收集参数

  • 不能确定参数的个数

  • 一般收集参数用args表示,约定俗成

def func(*args):
    print("hello,各位同学大家好,我简单的说两句")
    print(type(args))
    print("*" * 50)
    for item in args:         #注: args后面没有括号
        print(item)

func("xiaoming","China","18","打篮球")

打印结果:

hello,各位同学大家好,我简单的说两句
<class 'tuple'>
**************************************************
xiaoming
China
18
打篮球

——收集参数之关键字参数

— 以字典的形式存储、访问

— 比收集参数多一个*,

— 一般情况下用kwrags表示,约定俗成,即**

例:

def func(**kwargs):
    print("大家好,我简单说两句")
    print(type(kwargs))
    print("*" * 50)
    for k,v in kwargs.items():   #注意,此处为items,有s,不同与收集参数,没有复数形式
        print(k,"_____",v) # 注意:中间的横线字符需要用双引号“”括起来,两个逗号不能少

fun("我叫小明","湖南人","今年18岁","喜欢打篮球")

结果:

大家好,我简单说两句
<class 'dict'>
**************************************************
name _____ 我叫小明
ad _____ 湖南人
age _____ 今年18岁
hobby _____ 喜欢打篮球

1.4.5 混合实例—普通参数、收集参数、关键字收集参数

def func(name,age,*args,hobby = "none",**kwargs):
    #普通参数
    print("大家好,我简答的做一个自我介绍")
    print("我的名字是:{0},今年{1}岁了".format(name,age))
    #收集参数
    for item in args:        #注意:args后面没有括号
        print(item)
    if hobby == "none":
        print("我没有什么爱好")
    else:
        print("我的爱好是:")
    #关键字收集参数
    for k,v in kwargs.items():
        print(k,"____",v)

func("xiaoming","23","很高兴认识大家","希望大家能够多多关照","我不是一个随便的人,但是随便起来根本不是人",hobby = "yes",hobby1 = "打篮球",hobby2 ="羽毛球",hobby3 ="乒乓球",hobby4 ="足球")    

1.5 收集参数的解包问题

— 收集参数有时候在调用的时候需要加*来解包

例:

def func(*args):

    for item in args:

        print(item)

l = ["xiaoming","xiaohong","18sui","baskerball"]
func(l)

结果:

['xiaoming', 'xiaohong', '18sui', 'baskerball']

加入解包符之后:

def func(*args):

    for item in args:

        print(item)

l = ["xiaoming","xiaohong","18sui","baskerball"]
func(*l)

结果:

xiaoming
xiaohong
18sui
baskerball

同理,dict类型收集参数一样可以解包,但是

  • 对dict类型进行解包
  • 需要用两个星号进行解包 (还未弄懂dict类型的解包)**</u>

1.6 变量作用域(和C定义一致)

1 全局变量

  • 在全局范围内都能使用

2 局部变量

  • 只能在局部范围内使用

例:

a = 100

def func():
#打印全局变量a
    print(a)
    b = 50
    print(b)

print(a)
print(b) 

结果:

  • 100

  • 然后会报错

原因:a是全局变量,b是在函数func里定义的局部变量

- global 可将局部变量变成全局变量

例:

a = 100

def func():
#打印全局变量a
    print(a)
    global b
    b = 50
    print(b)

print(a)
func()         # 必须将调用的函数放在打印局部变量的前面,否则无法调用局部变量,为什么???
print(b)

结果:

100
100
50
50

1.7 golbals,locals函数

  • 可通过golbals和locals函数显示全局变量和局部变量

  • 两个函数都统称为内建函数

例:

a = 3000
def func(c,d):
    e = 111
    print("Locals={0}".format(locals()))

func(100,200)
print("Golbals={0}".format(globals()))

结果:

Locals={'e': 111, 'd': 200, 'c': 100}`

Golbals={'a': 3000}(注:应该是这个)`

1.8 eval 和exec函数

1.8.1 eval函数

  • 将字符串当做表达式来执行,最后返回执行表达式的结果
a = 100
b = 100
c = eval("a + b")

print(c)

结果:200

1.8.2 exec函数

  • 功能和eval相似,但是不返回结果
a = 100
b = 100

c = a + b

d = exec("print('a + b =',a +b)")

print(c)
print(d)

结果:

a + b = 200
200
None

1.9 递归函数

  • 函数直接或者简介的调用自己

  • 优点:简洁

  • 缺点:对递归深度有限制,消耗资源多

  • Python 会递归函数有限制,超过限制会报错

  • 一定要注意函数结束的条件

例:用递归函数实现斐波那契数列

f(1)=1,f(2)=1,f(3)=2,f(4)=3,f(5)=5,……………………,f(n)=f(n-1)+f(n-2)

def func(n):
    if n == 1 or n == 2:
        return 1
    else:
        return  func(n-1) + func(n-2)
n = input("请输入n的值:")
n = int(n)
v = func(n)    
print(v)

例:用递归函数解决汉诺塔问题

汉诺塔:

  • 有A,B,C三座塔,A上有从上至下,从小打到顺序排列的圆圈,通过一定的移动将A上的圆圈移动至C上

规则:

  • 每次只能移动一个盘子

  • 每次移动都要保证小圆圈在上,大圆圈在下

def hann(n,a,b,c):
    if n == 1:
        print(a,"-->",c)
        return None
    '''
    if n == 2:
        print(a,"-->",b)
        print(a,"-->",c)
        print(b,"-->",c)
        return None
    '''    #一般情况下都会写到n=2,n=3的情况下,可以看出用Python写出来非常简短
    #如果n>3,将a上的n-1个圆圈借助c,放到辅助柱子b上,具体怎么放不管
    hann(n-1,a,c,b)
    #再通借助柱子a,将b上的n-1个圆圈放到柱子c上,即为完成任务
    hann(n-1,b,a,c)

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