Python模块化编程-函数#学习猿地

### 模块化编程

> 模块化编程指把程序进行封装(函数封装,面向对象,文件。。。)

#### 什么是函数?

> function -> 函数,功能

>

> 函数就是一个具有特定功能的代码块

#### 函数的作用?

> 函数就是把代码进行封装,以提高代码的重用性,提高开发效率,并且降低了后期的维护成本

#### 函数的定义和使用

```python

# 定义函数【基本结构】

def 函数名([参数列表]):

  当前函数的具体功能的代码

  当前函数的具体功能的代码

  。。。。


# 函数封装完并不会执行,只是把函数定义了而已

# 如果想使用定义的函数,那么就需要用语法来进行函数的调用

# 函数的调用

函数名()

```

#### 函数的特征及注意事项

1. 函数定义后,不调用不执行

2. 不能在函数定义前调用函数

3. 函数的调用不受次数影响

4. 函数的命名要遵守命名规范

  + 字母数字下划线,不能以数字开头

  + 严格区分大小写,不能使用关键字

  + 命名最好有意义,且不要使用中文

5. 函数名不要冲突,冲突后会被覆盖

### 关于函数的参数

> 函数在定义时,可以在参数列表的位置定义形参

>

> 如果函数有形参,那么在函数调用时也需要给定参数

>

> 实参将值传递给形参的过程,本质上就是变量赋值操作

#### (1)函数参数概念及分类

  函数参数:调用时需要传递的数据.

  函数参数大类分为形参和实参:

  . 形参意思: 函数定义时的参数

  . 实参意思: 函数调用时的参数

  形实关系:函数调用时,形参和实参个数需要一一对应

  形参种类: 普通参数,默认参数,普通收集参数,命名关键字参数,关键字收集参数

  实参种类: 普通实参,关键字实参

#### (2)普通参数

(位置参数)普通的参数,接收实参传递的值

#### (3)默认参数:

> 位于普通参数后面,具有默认值的参数

>

> 语法:(x,y=2)  y就是默认参数

 #### (4)收集参数:

> 专门收集在函数调用时传递的多余的实参

```

1.普通收集参数:专门用于收集多余的普通参数,形成一个新的元组

语法:参数前面加* 例:*args

2.关键字收集参数:用于专门收集多余关键字实参,形成一个新的字典

  语法:参数前面加** 例:**kwargs

```

#### (5)命名关键字参数

> 定义时放在*号后面的参数,调用时强制必须传入指定参数名才能调用

```

语法:(a,*,x) x是命名关键字参数

如果函数参数中已经有了收集参数,那么收集参数后面的参数即为命名关键字参数

  语法:(*args,x,y)

```

#### (6)形参声明的位置顺序:

> 普通参数 -> 默认参数 -> 收集参数 -> 命名关键字参数 -> 关键字收集参数

```

def func(a,b,c=1,*args,d,**kw)

a,b为普通参数,c是默认参数,args是收集参数,d是命名关键字参数,kw是关键字收集参数

极少出现五种参数同时出现的情况

def func(a,b=2,*,c,d,**kw)

a为普通参数,b是默认参数,c,d是命名关键字参数 ,kw是关键字收集参数

```

 #### 所有参数的摆放问题

- 实参:普通实参在前,关键字参数在后

- 形参:

 - 关键字收集参数一定在最后出现

 - 收集参数推荐在普通参数之后使用

- 推荐顺序:普通形参,收集参数,关键字收集参数

### 函数返回值

> 一个函数除来可以完成一定功能之外,还可以按需要返回一些内容

>

> 函数中使用 return 关键字来指定返回数据,可以返回任意类型的数据

>

> 函数的返回值,会把数据返回到调用处,可以使用变量接收,或其它处理

```

函数可以分为两类

  1。执行过程函数: 函数体内完成一定的功能既可,没有返回值

  2。具有返回值的函数: 函数体内完成一定的功能,并且返回一个结果到函数调用处

```

#### return返回值的特征

+ 函数中可以使用 return 进行数据的返回

+ 可以使用return 返回 任意内容或数据

+ return 会把返回值,返回到函数调用出

+ return 意味着函数的结束,return之后的代码不在执行

+ 如果在函数中没有使用return 或者 return后面没有任何内容,那么默认返回 None

```python

# 假设有这样一个需求,定义一个函数,完成两个数的计算,并把结果输出

# def jia(n1,n2):

#   res = n1+n2

#   print(res)

# jia(2,5)

# 需求改变,定义一个函数,完成两个数的计算,并把结果返回

def jia(n1,n2):

  res = n1+n2

  return res

r = jia(2,4)

print(r)

```

### 变量作用域

> 作用域就是当前起作用,可用的范围区域

>

> 变量的有效范围

全局变量:在函数内外都可以使用的变量

局部变量:在函数内部可以使用的变量

```

局部变量

  函数内定义的变量,局部变量,在函数外不能使用

全局变量

  在函数内部使用 global 直接定义的变量,就是全局变量,函数内外都可以使用

  在函数外定义的变量,在函数内使用 global 关键字进行声明,那么也是全局变量

globals() 获取全局数据

locals() 获取当前作用域的数据

  在函数外定义的变量,函数可以访问,但是不能更改

数据类型的分类:

  可变数据类型:在函数外定义的变量,在函数可以使用,

    列表和字典

  不可变数据类型:在函数外定义的变量,在函数内只能访问,不能使用其它操作

```

#### 不光变量有作用域,函数一样也有相同的作用域

```python

def outer():

  print('this is outer function...')

  # 在函数内定义的函数,称为 局部函数,函数外无法使用

  def inner():

    print('this is inner function...')

  inner()

outer()

# inner()

```

### nonlocal

> 在内函数中如何使用上一层函数中的局部变量?

> 在内函数中如果想使用外层函数的变量,那么需要使用 nonlocal 关键字 引用

> 可以引用上一层函数中定义的局部变量,但依然不能提升为全局变量

```python

# 定义一个外层函数

def outer():

  # 外函数的局部变量

  num = 10

  # 内函数,局部函数,在函数的内部定义的函数

  def inner():

    # nonlocal 关键字在局部函数中使用,

    nonlocal num # 可以引用上一层函数中定义的局部变量,但依然不能提升为全局变量

    num += 1

    print(num)

  inner()

outer()

# print(num)

```

#### 关于函数的文档

```python

def outer():

  '''

  这里是让你些当前函数的文档说明的。

  需要说明当前函数的作用,

  如果当前函数还有行参,那么也需要对行参进行一一说明

  name: 这个是一个name参数,有什么作用。。。

  age : 这个表示当前的一个年龄

  :return: 此处说明当前函数的返回值。。。

  '''

print(globals())

print(__name__) # 获取当前脚本的文件名,

print(__doc__) # 获取当前脚本的说明文档

# print(outer.__doc__) # 获取当前函数的说明文档

'''

魔术变量

__name__ ==> 当前脚本如果作为主程序,那么值是 __main__,如果是当做一个模块,在另外一个脚本中引用去使用,那么值就是当前文件的名字

__doc__  ==> 当前脚本的文档说明 在当前脚本当中的第一个 三引号注释就是当前脚本的说明文档

{

  '__name__': '__main__', 

  '__doc__': '\n在内函数中如果想使用外层函数的变', 

  '__package__': None,

   '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x110444350>, 

   '__spec__': None, 

   '__annotations__': {}, 

   '__builtins__': <module 'builtins' (built-in)>, 

   '__file__': '/Users/yc/Desktop/code/8.nonlocal关键字.py', 

   '__cached__': None, 'outer': <function outer at 0x1104938c0>

}

'''

```


掌握学习方法,不如会弯道超车!

学习猿地:成就自己的只需一套精品!

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

推荐阅读更多精彩内容

  • 第5章 函数和函数式编程 5.1 引言函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数...
    VIVAFT阅读 943评论 0 5
  • 这篇笔记记录的知识点:函数的基本概念自定义函数函数的几种参数 编程的三种方式:1.OOP 面向对象编程,万物皆对象...
    古月半半阅读 910评论 0 2
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,727评论 2 9
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,724评论 0 8
  • 临时起义去草原天路,瞧瞧祖国的大好河山! 老公刚好有两天假,一时兴起问我想去那里玩,北京周边可以玩的美景还是很多滴...
    娜些话儿阅读 701评论 7 3