函数基础部分

.什么是函数?

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。

2.定义函数

定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
   def 是固定的,不能变,他就是定义函数的关键字。
   空格:为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。
   函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能(变量的命名规范)
   括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
   注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用:就是 函数名() 要记得加上括号。

3.函数调用和参数

函数要先定义,后执行。定义完了之后不调用,就不执行
def userinfo(name,age,sex="男"): #其中sex是默认参数,name,age是未知参数
info = "姓名是%s,年龄是%s,性别是%s"%(name,age,sex)
return info
user=userinfo('kobe',age=18,sex="女") #其中kobe是未位置参数,age,sex是关键字参数
print(user) 函数名():不管是在哪个地方出现都是在调用函数 函数的参数:
形参--->函数定义的时候
位置参数 a,b 传参的时候一一对应从实参处接受
默认参数 a=1 在定义的时候就设定好值了 实参--->函数调用的时候
位置参数 1,2, 传参的时候一一对应给形参
关键字参数 a=1 通过形参的名字指定传值
混合:
形参 def func(a,b,d,f=1):
实参 func(1,2,3,f=2) 传参--->将实参传递给形参的过程   #形式参数-->变量名后面()里面的参数
  #实际参数-->实际上要传递的参数
  #传参-->将实参传递给形参的过程叫做传参,
  #位置参数-->形参和实参是有一个位置的关系,能一一对应,叫做位置参数
  #默认参数-->定义默认参数的时候,有时候传递的实参和接受的形参数量并不一定相等
  #关键字参数-->这样就不需要记住每一个参数的位置了,只需要在调用的函数的时候,给参数进行赋值就可以
  注意:位置参数优先级要高于关键字参数(如果位置参数传递不正确的话会报错)

4.函数的返回值

1.没有return就默认返回None
2.写了return 没有写返回值 默认返回None
3.多个返回值的时候,返回的是一个元组
4.一个返回值的时候,返回的就是返回值本身
5.return 下面的代码不执行,并且结束这个函数 返回值作用:
  1,结束整个函数。return下面的代码都不执行
  2,给函数的执行者(调用者)返回值。 返回值返回给谁:
  谁调用函数就把返回值返回给谁

5.初识函数其他知识点

1.函数先定义后执行,定义完了之后不调用,就不执行
2.print(函数名) --->函数的内存地址---><function userinfo at 0x0000000001D31E18>
3.函数执行过程:定义--->调用---->函数体代码
4.谁调用了函数,函数的返回值就返回给谁。如果返回值是1个,就返回字符串,2个以上的话,就返回元组
5.函数名():不管在哪个地方都是在调用函数
6.传递参数时:位置参数要高于关键字参数,一定要将位置参数--对应之后,只进行关键字赋值
7.三元运算符:c = a if a>b else b--->如果a>b就将a的值返回给c,否则就将b的值返回给c (通常在不确定到底是什么数值的时候用到)

other 

1.全局变量必须要定格去定义,不能定义在缩进里面
2.()叫做调用操作符,[]叫做索引操作符
3.如果直接要是用一个便令,默认使用全局的

函数进阶部分

1.动态参数

*agrs:接受的位置参数,返回元组
**kwargs:接受关键字参数,返回字典 动态参数:
  动态参数的用途:在不明确接受参数的数量时,使用*args和**kwargs来接受参数,分别返回
  注意:*args和**kwargs中的英文字母可以是任意的符合变量定义规范的数据类型,但是通常不这么做!
动态参数出现位置:
  动态位置参数>动态关键字(默认)参数
  形参:位置参数>动态位置参数>默认参数>动态关键字(默认)参数
  实参:位置参数>关键字参数
动态参数中*的作用:
  实参:
    *args在实参处调用时,*将可迭代对象打散,字典是将键值取出
    **kwargs在实参处调用时,将字典打散,形成关键字参数,{键:值}相互对应
  形参:
    *args在形参处出现时,*代表的是将接收到的位置参数聚合成元组
    **kwargs在形参处出现时,**代表的是将接收到的关键字参数聚合成字典
复制代码

 2.函数注释

def info(user,name):
"""
:param user:
:param name:
:return:
"""
print(1)
#在函数体内,连续输入三个双引号的因为字符,然后回车
查看注释: func名.__doc__
查看文件名: func名.__name__
查看文件路径:
  import os
  print(os.path.abspath(__file__))

3.命名空间:把同名的变量区分出不同的作用域

在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来。
但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已!
只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空. 我们给存放名字和值的关系的空间起一个名字叫: 命名空间. 我们的变量在存储的时候就 是存储在这片空间中的.
命名空间的分类:
  内置空间: 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
  全局空间: 我们直接在py文件中, 函数外声明的变量都属于全局命名空间
  内置空间: 在函数中声明的变量会放在局部命名空间
加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值顺序:找不到就报错
  在局部调用:局部命名空间->全局命名空间->内置命名空间
  在全局调用:全局命名空间->内置命名空间 作用域:作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
  全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
  局部作用域:局部名称空间,只能在局部范围内生效,函数内部生效

global:在局部修改全部变量,如果没有就创建一个新的。
  nonlocal:在局部空间内,修改离自己最近的变量,如果上一层没有就继续向上找,直到找到局部变量的顶层,局部空间内没有可以修改的变量,就报错。

 4.函数嵌套

1. 只要遇见了()就是函数的调用. 如果没有()就不是函数的调用
2. 如果看见了print(函数名)是打印函数的内存地址
global:
global:
  1,声明一个全局变量。
  2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。
  ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。
代码示例:
  a = 100
  def func():
  global a # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a
   a = 28
  print(a)
  func()
  print(a)

 nonlocal

nonlocal:
  1,不能修改全局变量。
  2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
代码示例:
a = 10
def func1():
a = 20
def func2():
nonlocal a
a = 30
print(a)
func2()
print(a)
func1() 结果:
加了nonlocal
30
30 加nonlocal
30
20

函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,他是单向的。

other

函数名本质上就是函数的内存地址或对象。
    1.可以被引用
    2.可以被当作容器类型的元素
    3.可以当作函数的参数和返回值
    4.如果记不住的话,那就记住一句话,就当普通变量用 闭包函数:内部函数包含对外部作用域而非全局作用域变量的引用,该内部函数称为闭包函数
闭包函数的常用实践:
  由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!
  我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?
  是不是直接就把这个函数的名字返回就好了?
  这才是闭包函数最常用的用法 代码实现:
  def func():
  name = 'eva'
  def inner():
 print(name)
      #print(inner.__closure__)有cell元素,就是闭包元素
 return inner #返回的时inner的内存地址
  f = func()
f()

python基础 (初识函数&函数进阶)的更多相关文章

  1. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  2. python基础——高阶函数

    python基础——高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数a ...

  3. python基础——内置函数

    python基础--内置函数  一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highl ...

  4. python学习第五讲,python基础语法之函数语法,与Import导入模块.

    目录 python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 1.函数语法定义 2.函数的调用 3.函数的文档注释 4.函数的参数 5.函数的形参跟实参 6.函 ...

  5. Python基础初识

    一.安装 暂时没空写,预留 二.python基础初识 2.1 注释 当行注释:# 被注释内容 多行注释:'''被注释内容''',或者"""被注释内容"" ...

  6. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  7. 『Python基础-13』函数 Function

    这篇笔记记录的知识点: 函数的基本概念 自定义函数 函数的几种参数 编程的三种方式: 1.OOP 面向对象编程,万物皆对象,以class为主,抽象化 2.POP 面向过程编程,万事皆过程,def定义过 ...

  8. python基础之open函数和路径处理

    前言 本次内容主要介绍文件处理open函数以及路径处理. 一.open函数 根据前面介绍的函数调用方式,调用open函数. #open函数调用 open() TypeError: open() mis ...

  9. Python基础(协程函数、内置函数、递归、模块和包)-day05

    写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04  ...

随机推荐

  1. C语言博客作业4--数组

    C语言博客作业4--数组 1.本章学习总结 1.1思维导图 请以思维导图总结本周的学习内容,如下图所示: 1.2本章学习体会及代码量学习体会 1.2.1学习体会 描述本周学习感受,也可以在这里提出你不 ...

  2. 逆向工程vgenerator(三)

    前言 该项目的最后一篇博文,最终构建,写入文件,整体项目流程将在本片文章中写出. jdbcType /** *@author vvxtoys *mysql单位 -> jdbcType */ pa ...

  3. python if,循环的练习

    1.变量值的交换 ​ s1='alex'​ s2='SB' (s1,s2) = (s2,s1) 2.有存放用户信息的列表如下,分别存放用户的名字.年龄.公司信息 userinfo={ 'name':' ...

  4. 使用Keras训练大规模数据集

    官方提供的.flow_from_directory(directory)函数可以读取并训练大规模训练数据,基本可以满足大部分需求.但是在有些场合下,需要自己读取大规模数据以及对应标签,下面提供一种方法 ...

  5. Spring Boot+Spring Security:获取用户信息和session并发控制

    说明 (1)JDK版本:1.8(2)Spring Boot 2.0.6(3)Spring Security 5.0.9(4)Spring Data JPA 2.0.11.RELEASE(5)hiber ...

  6. 【学习】python文件读写,用with open as的好处,非常好【转载】

    原文链接:http://www.cnblogs.com/ymjyqsx/p/6554817.html 备注:博主还有很多值得学习的笔记,遇到问题可以拜读,非常感谢博主的总结 读写文件是最常见的IO操作 ...

  7. matlab-调用摄像头人脸识别

    ----------------------------边学边写边学习------------------------------------- 版本:2014a 调用摄像头 a = imaqhwin ...

  8. 全面超越Appium,使用Airtest超快速开发App爬虫

    想开发网页爬虫,发现被反爬了?想对 App 抓包,发现数据被加密了?不要担心,使用 Airtest 开发 App 爬虫,只要人眼能看到,你就能抓到,最快只需要2分钟,兼容 Unity3D.Cocos2 ...

  9. centos7配置网易yum源

    部分参考centos6: https://blog.csdn.net/jinzhencs/article/details/53673999 下载yum:  https://www.cnblogs.co ...

  10. STS 安装SVN插件

    1:STS中 Help->Eclipse MarketPlace 搜索svn点击go安装svn插件,然后重启STS. 2:如果Team中出现SVN说明安装好了一半. 3: 手动安装SVN Con ...