08Python的函数

第八章 Python的函数


#函数
print()
a = 1.123456
result = round(a,2)  #结果保留小数点后两位。执行四舍五入
print(result)

#如何查看一个内置函数的功能?
# 在IDLE里 使用help(  )   括号里添上要查的函数名称即可

函数的功能:
1.功能性
2.隐藏细节
3.避免重复的编写代码


组织代码。自定义函数

8-2 函数的定义及运行特点

'''

自定义函数

def funcname(parameter_list):    # 函数体
    pass
1.参数列表可以没有
2.在函数体里面可以使用return,来返回函数的结果。若函数体里没有return,默认返回None
return 后面不执行

编写一个函数:
1.实现两个数字的相加
2.打印输入的参数

def add(x,y):
    result = x + y
    return result

def print_code(code):
    print(code)

a = add(1,2)
b = print_code('python')
print(a,b)
'''
![1524732128529.jpg](https://upload-images.jianshu.io/upload_images/11154655-d10bf0536a13195b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

代码运行的时候,执行到a的时候,并没有被打印出来,运行到b ,就会去调用函数,所以先出现Python,print(a,b)出现3和none,3是函数调用的结果,none是因为定义的函数里没有return,默认返回None

![1524732128529.jpg](https://upload-images.jianshu.io/upload_images/11154655-d9a9feddf7b689d9.

8-3 如何让函数返回多个结果

#如何return两个值?
#R Skill1 Skill2

def damage(skill1,skill2):
    damage1 = skill1*3
    damage2 = skill2*2 + 10
    return damage1,damage2   #没有必要加上括号,此种形式的结果输出就是元组

skill1_damage,  skill2_damage  = damage(3,6) # 序列解包(函数的调用)
print(skill1_damage,skill2_damage)
#print(type(damages))

image

8-4 序列解包与链式赋值

#什么是序列解包?
赋值的方式:
a = 1
b = 2
c = 3
也可以:a,b,c = 1,2,3

d = 1,2,3
print(type(d))   #打印结果就是序列类型

a,b,c = d   #把一个序列d拆成了这样的3个值,就叫做序列解包 


a,b,c = [1,2,3]
d = 1,2,3            #序列解包的过程
a,b,c = d

python入门与进阶补充

本章主要补充函数 的相关知识

def name():#定义一个无参数的函数,只是通过这个函数打印
    print('xiaoyu')#缩进4个空格
name() #调用函数,打印结果

def add(x,y): #定义一个函数
    return x + y
result = add(2,3) # 此时的add是一个对象,只有对象才有类型,并且是一个function类
print(result)

8-5 必须参数与关键字参数

函数的参数:
1.必须参数

def add(x,y):
    #x y 形式参数   形参
    result = x + y
    return result

def print_code(code):
    print(code)

a = add(1,2)#实际参数   实参
b = print_code('python')
print(a,b)


2.关键字参数    意义在于代码的可读性
def add(x,y):
   
    result = x + y
    return result
c = add(y=3,x=2)#关键字参数,就是在调用的时候,明确指定想用的参数值到底是给哪个


3.默认参数
def print_student_files(name,gender='男',age='8',college='人民路小学'):#默认参数的设置
    print('我叫' + name)
    print('我今年' + str(age) + '岁')#字符串不能喝int类型相加,所以把age转化成str类型
    print('我是' + gender + '生')
    print('我在' + college + '上学')
print_student_files('小鱼','男',8,'人民路小学')
print('--------------------------------')
print_student_files('小鱼')  #默认参数起到作用了

#对于大多数学生只要输入姓名就行了,其他的都是一样的,所以使用默认参数设置好以后,直接打印即可。
print('--------------------------------')


#如果出现性别和年龄是个别的,就在实参里改动即可,默认参数不要动
print_student_files('喜小乐','女',16)

#原则如下:
# 定义函数的开始,把默认值赋值给形参,上面给了3个默认参数,也可以更改的
# 调用规则,如果有形参没有设置默认值,调用的时候就必须要传实参

print('-------------------------')
print_student_files('果果',age = 17,college='光明路小学')
#必须加上age=17,因为参数之间一一对应,如果不写age,默认对应的是性别,所以age不能少
# 关键字参数可以不遵守顺序
# 默认参数和必须参数不能混合调用

8-7 可变参数

def demo(*param):#    * 是用来定义一个可变参数的列表
    print(param)
    print(type(param))

demo(1,2,3,4,5,6,7,8)

# 如果想直接传递一个元组怎么办?demo((1,2,3,4,5,6,7,8))这个方法是错误的,打印结果是二维元组

# 看看正确的打开方式
def demo(*param):#    * 是用来定义一个可变参数的列表
    print(param)
    print(type(param))
a = (1,2,3,4,5,6,7,8)
demo(*a)  #不能直接传a,直接传a就是二维元组,所以在a前面要加上一个*
# *a 的作用就是a元组里面的每一个元素平铺出来,传递到可变参数的函数里面
# 可变参数也可以和必须参数混合使用,但是必须参数必须放在可变参数前面,默认参数也是这样
# 看看下面的例子
def demo(param1,param2=2,*param):
    print(param1)
    print(param2)
    print(param)
demo('a',1,2,3)

def demo(param1,*param,param2=2):
    print(param1)
    print(param)
    print(param2)

demo('a',1,2,3,'param')

def demo(param1,*param,param2=2):
    print(param1)
    print(param)
    print(param2)

demo('a',1,2,3,param2='param')

看看最后3段代码带来的结果

image
image
image

8-8 关键字可变参数

def squsum(*param):  #可变参数
    sum = 0
    for i in param:
        sum +=i * i
    print(sum)

squsum(1,2,3,4,5,6)

# 举个例子,如果想要知道全国任意城市的温度,怎么编程?这时候需要用到
# 用到任意个数关键字参数,看例子

def city_temp(*param):
    pass

city_temp(bj = '32c',xm = '23c', sh = '32c')
# 上述运行会出错,如图1,原因在于一个 * 不能接受可变的关键字列表!
# 看下正确的运行结果

def city_temp(**param):  #用两个星号就可以了  **
    print(param)
    print(type(param))
    pass
city_temp(bj = '32c',xm = '23c', sh = '32c')
# 如图2所示,打印出来的是字典
# 想一想,知道了是字典类型以后,要求在city_temp内部,把每个城市的温度打印出来
# 该如何处理?
# 要打印可变关键字里面列表的所有元素,我们就要遍历这个字典,问题转换为如何迅速的遍历字典?

def city_temp(**param):
    for c in param:
        print(c)
city_temp(bj = '32c',xm = '23c', sh = '32c')
# 如图3,打印结果只有城市,没有温度,不正确

# 下面看看另外一种错误的打开方式!

def city_temp(**param):
    for key,value in param:
        print(key,':',value)
city_temp(bj = '32c',xm = '23c', sh = '32c')
#  打印结果如图4,是错误的

# 正确遍历字典的方法如下:

def city_temp(**param):
    for key,value in param.items():# 调用param里的内置方法items即可!
        print(key,':',value)
city_temp(bj = '32c',xm = '23c', sh = '32c')

#上述结果如图5所示,打印的是正确结果!!
# 面对一个关键字列表 ,如何把一个字典传进来?如图6

def city_temp(**param):
    for key,value in param.items():# 调用param里的内置方法items即可!
        print(key,':',value)
a = {'bj' : '32c','xm' : '23c', 'sh' : '32c'}
city_temp(**a) #这样即可

# 无论是普通参数列表,还是关键字可变参数列表,目的都是简化函数的调用
# 无论是普通参数列表,还是关键字可变参数列表,他们都有共同的特性:
#来看看上面值都不传入的情况下:图7

def city_temp(**param):
    print(param)
    for key,value in param.items():# 调用param里的内置方法items即可!
        print(key,':',value)
a = {'bj' : '32c','xm' : '23c', 'sh' : '32c'}
city_temp() # 什么值都不传入,打印的是字典,但是for循环进不去
# 混合参数的情况下,怎么处理?
def city_temp(param1,**param): #必须参数,可变参数
    print(param1)
    print(param)
    for key,value in param.items():
        print(key,':',value)
a = {'bj' : '32c','xm' : '23c', 'sh' : '32c'}
city_temp(1) # 此时传入必须参数的1
# 如图8  打印结果是 param1 是1 而**param打印结果是空字典

image
image
image
image
image
image
image
image

8-9 变量作用域

c = 50

def add(x,y):
    c = x + y
    print(c)
# 变量作用域
add(1,2)
print(c)
# 看下图一的打印结果,虽然都是c,但是范围是不同的,故结果不一样

# 看看例2

def demo():
    c = 10

print(c) #打印结果是错误的,c的使用在函数内部,直接在函数外部打印,超出了c的作用域!

# 看看例3
c = 10
def demo():
    print(c)

demo() #打印结果是正确的,因为c在函数外部作用的,在函数内部引用可以打印成正确的结果


c = 10 #全局变量
def demo():
    c = 50#局部变量
    print(c)

demo() 

def demo():
    c = 50
print(c)#此时无法引用局部变量


def demo():
    c = 50
    for i in range(0,9):
        c += 1
    print(c)#此时打印结果是正确的,引用的就是局部变量


#看看下面的例子
c = 1 # 外部做一个变量。

def func1():
    c = 2 # 内部做一个变量
    def func2():#在函数内部在定义一个函数
        c = 3
        print(c)
    func2()

func1()
#作用链域是一个最基本的法则

8-11 global关键字

全局变量不仅仅可以在模块里使用,在整个应用程序里都是可以引用的

def demo():
    global c  #使用global可以访问局部变量(把局部变成全局)
    c = 2

demo()
print(c)
#在整个应用程序里均可以使用global,不仅仅是在模块中

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

推荐阅读更多精彩内容