计算和控制流(二)代码组织函数

一、封装一个功能

1.容器是对数据的封装、函数是对语句的封装、类是对方法和属性的封装
2.函数(function)程序中实现明确功能的代码段可以封装成一个函数,以便复用(reuse)。

3.定义与调用函数

3.1定义函数:
用def语句创建一个函数,用return关键字指定函数返回的值。语法如下图:

def <函数名> (<参数表>):  #def后面是一个函数名然后是一个圆括号,参数写在圆括号中,如果没有参数圆括号也要写上
       <缩进的代码段> 
       return <函数返回值>



#定义一个函数
def printme(str):
  print(str)
  return

3.2调用函数语法如下图:

<函数名>(<参数>)
无返回值:<函数名>(<参数表>)
返回值赋值:n = <函数名>(<参数表>)



#定义一个函数
def printme(str):
  print(str)#打印任何传入的字符串
  return
#调用函数
printme("我要调用自定义函数") #函数名圆括号里面填上参数
printme("我要你再次调用函数")


#输出
F:\j\venv\Scripts\python.exe F:/j/demo5.py
我要调用自定义函数
我要你再次调用函数

Process finished with exit code 0

3.3函数的定义和调用实例如下图:

def sum_list(alist): #定义一个带参数的函数
  sum_temp = 0 #求和变量
  for i in alist:
    sum_temp+=i #累加循环
  return sum_temp #函数返回值
print(sum_list) #查看函数对象sum_list
my_list = [123,45,67,89,100]
my_sum = sum_list(my_list)#调用函数,将返回值赋值给my_sum这时上面的(alist)参数列表已经指向了(my_list)
print("sum of my list:%d" % (my_sum,))#打印输出my_sum列表的累加之和

输出

F:\j\venv\Scripts\python.exe F:/j/demo5.py
<function sum_list at 0x0000000001E8E2F0>
sum of my list:424

Process finished with exit code 0 
4.变量的作用区域

4.1局部变量(local variable):在函数内部定义的参数以及变量,只有在该函数定义范围内有效,函数外边无法访问到。如下图所示:

 def addnum(num1,num2):
    result = num1+num2 #这个result是属于addnum函数的局部变量,在函数之外无法引用
    return result

print(result)

输出

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    print(result)
NameError: name 'result' is not defined
#结果报错说result没有被定义

4.2全局变量(Global variable):在函数外部定义的,作用区域是整个代码段如下图:

def addnum (num1,num2):
  result = num1+num2
  return result

num1 = 5 #num1和num2这两个变量都是在是函数addnum之外定义的所以它的作用区域为整个代码段
num2 = 10
print(addnum(num1,num2))

输出

F:\j\venv\Scripts\python.exe F:/j/demo5.py
15

Process finished with exit code 0

4.3 global关键字:在函数内部使用与全局变量同名的变量时,若未在函数内进行定义,则使用全局变量的值。一旦在函数内部进行定义,python会在函数内部创建一个局部变量,与全局变量就不相关了,使用global关键字可以在函数中改变全局变量的值。如下图所示:

num1 = 1
num2 = 2
def addnum():
  num1,num2 = 2,3#在函数内部定义两个变量并赋值,注意如果没有这句代码,那么python语言就会在该作用域中找不到的情况下向外面去寻找即寻找全局变量num1和num2值为1,2最后调用addnum函数时的结果就1+2=3
  return(num1+num2)#即使前面我们已经设定了num1和num2的值为1,2,但是这里num1和num2是在函数内部的赋值的所以它是一个局部变量,所以后面调用addnum函数时它返回值依然是2+3=5
print(addnum())
print(num1,num2) #这里的num1和num2是函数外面的变量 即全局变量所以它们的值是前面设定的1,2

def addnum():
  global num1,num2 #虽然这里面global后面的num1和num2是在函数内部,但是因为加了global关键字所以它们是代表了外面的全局变量的num1和num2
  num1,num2 = 2,3 #这里的num1和num2是全局变量num1和num2它们以前的值为1,2现在重新给它们赋值为2,3改变全局变量的值
  return(num1+num2)
print(addnum())
print(num1,num2)

输出

F:\j\venv\Scripts\python.exe F:/j/demo5.py
5
1 2
5
2 3

Process finished with exit code 0
5.函数小技巧:map()函数

5.1 map函数map的意思为映射的意思,有时候需要对列表中每个元素做一个相同的处理,得到新的列表,例如:所有数据乘以3、所有字符串转换为整数、两个列表对应值相加语法如下图:

map(func,list1,list2....) #将一个函数传进去
#函数func有几个参数,后面跟几个列表

5.2map函数的基本用法举个例子如下图所示:

#一个列表中的元素处理
num = [10,20,40,80,160] #创建两个列表并且每个列表都包含5个元素
lst = [2,4,6,8,10]
def nul3(a): #设定一个函数并设置一个参数(a)
    return a*3 #返回参数乘以3之后的值
print(list(map(nul3,num))) #引用map函数将nul3函数和num列表传进去得到一个生成器,这个生成器包含了num列表中每个元素乘以3的值然后转换成列表输出

#两个列表中的元素处理
def atob(a,b): #设定一个函数atob并设置两个参数
    return a + 1/b #返回参数a加b分之一的值
print(list(map(atob,num,lst))) #前面设置了两个参数后面就必须跟两个列表,那么这时参数a和b分别指向了列表num和lst,再将这两个列表计算的返回值转换成列表进行输出

输出

F:\j\venv\Scripts\python.exe F:/j/demo9.py
[30, 60, 120, 240, 480]
[10.5, 20.25, 40.166666666666664, 80.125, 160.1]

Process finished with exit code 0
5.3函数小技巧:匿名函数lambda

5.3.1 有时候函数值用一次,其名称也就不重要,可以无需费神去def一个,可以用lambda表达式生成一个,lambda表达式会返回一个匿名函数。语法如下图:

lambda <参数表>:<表达式> #参数表中的参数可以是一个也可以是多个

5.3.2引用匿名函数lambda举个例子如下图:

num = [10,20,40,80,160]
lst = [2,4,6,8,10]

print(list(map(lambda a:a*3,num)))#引用lambda函数生成一个匿名函数,函数后面设一个参数a然后冒号后面跟一个表达式最后一个列表,这样参数a指向了列表num然后最列表中的每个元素进行计算转换成列表输出
print(list(map(lambda a,b:a+1/b,num,lst)))#引用lambda函数生成一个匿名函数,函数后面设两个参数a和b然后冒号后面跟一个表达式最后两个列表,参数a,b分别指向了列表num和lst两个列表进行计算之后输出

输出

F:\j\venv\Scripts\python.exe F:/j/demo9.py
[30, 60, 120, 240, 480]
[10.5, 20.25, 40.166666666666664, 80.125, 160.1]

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

推荐阅读更多精彩内容