1. 前言
    目前所学的方式去计算“s = ‘人生若只如初见’”的长度。
  1. 用len()函数计算
s = '人生若只如初见'
print(len(s))  # 用len()函数计算,len()函数属于内置函数。返回结果为:7
  1. 用for有限循环语句计算
i = 0
for k in s:  # 用for有限循环语句计算i += 1
print(i)  # 返回结果为:7
  1. 函数的自定义:def
    内置函数:Python本身存在的,可直接使用的
    自定义函数:编程者自己为了方便调用信息,自己给代码定义的函数
    自定义函数格式:def + 一个空格 + 函数名(与变量名的规格一致) + 一对括号() + 冒号:
    如下定义一个计算字节长度的函数的定义格式,函数名即my_len
s = '人生若只如初见'
# 自定义/声明函数,该函数的名字就是my_len,该函数需要被调用时才使用def my_len():i = 0for k in s:  # for语句i += 1return i  # 返回一个值,此处必须需要有return,下面调用的函数length才能打印出结果length = my_len()  # 调用函数my_len()
print(length)  # 返回结果为:7
  1. 函数的调用
    定义/声明好的函数可以在任何需要它的地方被多次调用;
    不能修改、只输出结果、函数的结果不能被用于赋值;
    函数的嵌套调用:函数与函数之前的代码是不会互相影响的。
def func():return {'k':'v'}  # 一个返回值return 1  # 遇到return,结束语句print(func())  # 返回结果为:{'k': 'v'}(在此处调用了函数func())
# 函数的嵌套调用:函数与函数之前的代码是不会互相影响的
def f1(l):for i in l:print(l)
def f2(l):for i in l:print(l)f1([1, 2, 3, 'rt5ry'])  # 调用函数f1
f2(['A','B','C'])  # 调用函数f2,返回结果为:循环打印括号一名的内容

  1. 函数的返回值
    return 是一个关键字,我们管写在return后面的值叫“返回值”;不写return的情况下,会默认返回一个None。
    返回值的三种情况:
  1. 没有返回值,
    a. 不写return;
    b. 只写return,后面不写其他内容(因为一旦遇到return,结束整个函数);
    c. return与return None的功能一致。
  2. 返回一个值,
    a. return后面写上要返回的内容即可;
    b. return和返回值之间要有空格,可以返回任意数据类型的值;
    c. 如果在一个程序中遇到了多个return,只执行第一个,后面的都不执行。
  3. 返回多个值
    a. 只写一个return;
    b. 有多少返回值则相应的用多少个变量接收;
    c. 返回多个值可以用一个变量接收,得到的是一个元组。
# 函数无返回值的自定义函数
s = '人生若只如初见'def my_len():i = 0for k in s:  # for语句计算i += 1print(i)  # 返回结果为:7
#  一个返回值
def func():return {'k':'v'}  # 一个返回值return 1  # 遇到return,结束语句print(func())  # # 返回结果为:{'k': 'v'}
# 多个返回值
def func():return 1,2  # 多个返回值
r = func()print(r)  # 返回结果为:(1, 2)
  1. 函数的参数
  1. 参数的传递内容
    a. 没有参数:定义函数和调用函数时,函数的括号里面不写内容
    b. 一个参数:传什么内容就是什么
    c. 多个参数:参数可以传递多个,多个参数之间用逗号分割。
# 函数的参数
def my_len(s):  # 自定义函数只需要0个参数,接收参数;形式参数(形参)i = 0for k in s:i += 1return iret = my_len(s)  # 传递参数(传参)
ret = my_len('可以传递列表,元组,字符串等')  # 计算括号内容的长度,实际参数(实参)
print(ret)  # 返回结果为:14
  1. 实参:按照位置传参数、按照关键字传参(不能给同一个变量传多个值)。3
  2. 形参:

a. 位置参数:必须传,多传或少传都会报错。

# 按照位置传参数
def my_sum(a, b):  # 定义一个求和函数res = a+b  # res及result的简写return ress = my_sum(1, 2)  # 计算1+2的结果,# 调用函数my_sum
print(s)  # 返回结果为3

b. 默认参数:也叫关键字参数,可以不传,若不传参则使用默认参数;若使用传参则使用传参的参数。

# 按照关键字传参(即默认参数传参)
def classmate(name, sex='boy'):print('%s:%s'%(name, sex))classmate('Bob')  # 调用函数classmate
classmate('Alice', 'girl')  # 等同于classmate(sex='girl', name='Alice')返回结果为:Alice:girl
classmate('Alex')

c. 可以无限多的接收参数,动态参数的值是可修改的;可以接收空的动态参数,不会报错。

# 动态参数的种类:*args:接收的是按照位置传参的值,组织成一个元组;在参数前加*,约定俗成默认用*args。**kwargs:接收的是按照关键字传参的值,组织成一个字典;在参数前加**,约定俗成默认用**kwargs。
共同点:可以接收任意多个参数。
def my_sum(*args):  # 定义一个动态参数,计算列表元素之和。n = 0for i in args:n += ireturn nprint(my_sum(1, 2))  # 返回结果为:3
print(my_sum(1, 2, 3))  # 返回结果为:6
print(my_sum(1, 2, 3, 4))  # 返回结果为:10
def func(*args, li=[]):  # 按照关键字传参,无法传任意多个动态参数print(args, li)func(1, 2, 3, 'str', ['list', 1, 2, 3, 4])
func(1, 2, 3, 'str', li=['list', 1, 2, 3, 4])
# 结合*args和**kwargs使用
def func(*args, **kwargs):  # *args和**kwargs的位置不能互换print(args, kwargs)func(1, 2, 'str', name='Alex', job='teacher')
# 返回结果为:(1, 2, 3, 'str') {'name': 'Alex', 'job': 'teacher'}
func(1, 2, 3, 'str', ['list', 1, 2, 3, 4])
# 返回结果为:(1, 2, 3, 'str', ['list', 1, 2, 3, 4]) {}
  1. 定义函数的时候:
    a. 位置参数:直接定义参数,如下例子定义classmate函数的位置参数name
    b. 默认参数:也可叫关键字参数,格式为参数名='默认的值
    c. 动态参数:可以接受任意多个参数
    (1)参数名之前加*,习惯参数名args,
    (2)参数名之前加**,习惯参数名kwargs,
    (3)args必须定义在**kwargs之前。
    d. 定义顺序:位置参数 -> 动态参数
    args -> 默认参数(关键字参数) -> 动态参数**kwargs,若顺序相反则会报错。
  2. 调用函数的时候:
    a. 按照位置传参:直接写参数的值,如下例子调用classmate函数的位置参数Alice等name值
    b. 按照关键字传:格式应为 关键字=值,如例子调用classmate函数的关键字参数girl等值
def func(**kwargs):  # 按照关键字传参,无法传任意多个动态参数print(kwargs)
# 动态参数,key的标准是数字不能开头,按照变量命名的标准func(name='Alex', height=175, weight=130)  # 返回结果为:{'name': 'Alex', 'height': 175, 'weight': 130}
func(a=1, b=2)  # 返回结果为:{'a': 1, 'b': 2}
func(a=1)  # 返回结果为:{'a': 1}
  1. 动态参数的另一种传参方式
def func(*args):  # (2)站在形参的角度上,给变量添加一个*,就是组合所有在实参被打散后传来的值。print(args)func(1, 2, 3, 4, 5)  # 动态参数的前一种表现形式
li = [1, 2, 3, 4, 5]  # 列表,返回值的结果
func(li[0], li[1] ,li[2], li[3], li[4])
func(*li)  # (1)站在实参的角度上,给一个序列上添加一个*,就是将此序列按照顺序打散,
# 动态参数**kwargs
def func(**kwargs):print(kwargs)func(a=1, b=2)  # 返回值的结果为:dic = {'a':1, 'b':2}
dic = {'a':1, 'b':2}
func(**dic)  # 返回值的结果为:dic = {'a':1, 'b':2}




7. 函数的注释
def func():
‘’’
先介绍这个函数实现的大概功能
参数1:作用,若数据类型等(若没有参数可不写)
参数2
参数3
……
:return:是字符串或者列表的长度等
‘’’
pass

  1. 命名空间
  1. 全局命名空间----与我们写的代码,而非函数中的代码有关
    a. 是在程序中从上到下被执行的过程中依次加载进内存的,
    b. 放置了我们设置的所有变量名和函数名。
  2. 局部命名空间----与函数有关
    a. 就是函数内部定义的名字,
    b. 当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,这个命名空间就又消失了。
  3. 内置命名空间----与Python解释器有关
    a. Python解释器(如Pycharm)本身所涵括的,可以直接使用的;如print(), input()等;
    b. 内置的名字在启动解释器的时候被加载到内存里的。

在局部命名空间:可以使用全局、也可使用内置的命名空间
在全局命名空间:可以使用内置命名空间,但不可使用局部命名空间
在内置命名空间:不可使用全局或局部的命名空间

# 在正常情况下会直接使用内置的名字;但当我们在全局定义了和内置名字空间中同名的名字时,会使用全部的名字。
def max(l):print('in max func')  # 返回值为:in max funcprint(max([1, 2, 3]))  # 返回值为:None
#使用全局命名
def input():print('in input now')def func():input()func()
# 返回值为:in input now
# 使用局部命名
def input():print('in input now')def func():input = 1  # 局部命名空间print(input)func()
# 返回值为:1
# 函数名() = 函数的内存地址()
# 函数名 + 括号表示一个函数的执行;而单单函数名则指的是一个函数的内存地址。
def func():print(input)print((func))  # 返回值为:函数体所在的内存地址<function input at 0x0000026E896DD268>
# 两个独立的局部名字空间不可互相调用
def func1():a = 1def func2():print(a)  # 返回值为:报错

  1. 作用域
    全局作用域----作用在全局:内置和全局名字空间中的名字都属于全局作用域;
    局部作用域----作用在局部:函数(即局部名字空间中的名字属于局部作用域)。
a = 1  # 属于全局作用域
def func():print(a)func()
# 返回值为:1'''

对于不可变数据类型,在局部可查看全局作用域中的变量,但是不能直接修改;
若想要修改,需要在程序一开始时添加global声明;
如果在一个局部(函数)内声明了一个global变量,则此变量在局部的所有操作对全局有效。

a = 1  # 属于全局作用域
def func():global aa += 1func()
print(a)
# 返回值为:2 (若将上述的global a去掉,运行函数则会保存)
# 使用locals查看局部作用域的变量
a = 1
b = 2def func():x = 'aaa'y = 'abc'print(locals())func()  # 返回值为:{'x': 'aaa', 'y': 'abc'}
# 使用globals查看全局作用域的变量
a = 1
b = 2def func():x = 'aaa'y = 'abc'print(locals())func()  # 返回值为:{'x': 'aaa', 'y': 'abc'}
print(globals())  # 可以查看全局命名空间以及内置命名空间的内容

globals永远打印全局的名字(为了代码安全,尽量避免使用);
locals输出的内容根据其所在的位置输出。

a = 1
b = 2
print(locals())  # 可以查看全局命名空间以及内置命名空间的内容
print(globals())  # 可以查看全局命名空间以及内置命名空间的内容
  1. 函数的嵌套和作用域链
    函数的嵌套定义

    内部函数可以使用查看外部函数的变量
    内部函数不可以直接修改外部函数

def max(a, b):return a if a > b else b
'''
函数的嵌套调用
函数实现的功能:两个值比较大小并输出最大值
:return:返回最大值
'''def the_max(x, y, z):  # 函数的嵌套调用c = max(x, y)return max(c, z)print(the_max(5, 8, 6))  # 返回结果为:8
# 函数的嵌套调用
def outer():a = 1def inner():b = 2print(a)print('inner')def inner2():print(a, b)print('inner2')inner2()inner()
outer()

nonlocal:只能用于局部变量,对上层中离当前函数最近的一层的局部变量进行声明,对全局无效;
声明了nonlocal的内部函数的变量修改会影响到离当前函数最近一层的局部变量。

a = 1
def outer():a = 1def inner():b = 2print(a)print('inner')def inner2():nonlocal a # 声明一个离函数inner2最近一层的局部变量a += 1print('inner2')inner2()inner()print('局部:', a)
outer()
print('全局:', a)
# 函数名的本质
def func():print(123)func2 = func  # 函数名可以赋值
func2()def func():print(123)func2 = func  # 函数名可以赋值
func2()
l = [func, func2]  # 函数名可以作为容器类型
print(l)
for i in l:  # 循环打印func和func2i()
def func():print(123)def abc(l):l()abc(func)  # 函数名可以作为函数的参数
def func():print(123)def abc(l):l()return l  # 函数名可以作为函数的返回值val = abc(func)
val()
  1. 默认参数的陷阱
    如果默认参数的值是一个可变数据类型,那么每一次调用函数的时候,如果不传值就共用这个数据的资源。
# 列表(可变数据类型)
def func(li = []):li.append(1)  # append()追加print(li)func()  # 返回结果为:[1]
func([])  # 返回结果为:[1]
func()  # 返回结果为:[1, 1]
func()  # 返回结果为:[1, 1, 1]
# 字典(不可变数据类型)
def func(li = {}):li['k'] = 'v'print(li)func()  # 返回结果为:{'k': 'v'} (此处的key必须为v的值)
func()  # 返回结果为:{'k': 'v'}
func()  # 返回结果为:{'k': 'v'}
def func(k, li = {}):li[k] = 'v'print(li)func(1)  # 返回结果为:{1: 'v'}
func(2)  # 返回结果为:{1: 'v', 2: 'v'}
func(3)  # 返回结果为:{1: 'v', 2: 'v', 3: 'v'}

函数----自定义函数相关推荐

  1. python函数——自定义函数详解

    python函数内容参考 文章目录 python函数 自定义函数 返回值 分类 递归函数 嵌套函数(内部函数) 变量的作用域 全局变量: 局部变量: Python函数参数 参数的传递 可变对象-不可变 ...

  2. 用matlab定义位移函数,matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)...

    matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法),哪吒游戏网给大家带来详细的matlab 定义函数(Matlab怎么调用函数 自定义函数使用方法)介绍,大家可以阅读一下,希望这篇 ...

  3. matlab 怎么使用function,Matlab怎么调用函数 自定义函数使用方法

    Matlab作为一款专业性极强的商业数学软件,将诸多的算法开发.统计分析.数据可视化功能融入其中,用户可以方便地调用需要的函数,建立数学模型,为了满足你工作的需要,还可以自行设置自己需要的函数,下面就 ...

  4. 学习聚宽4:函数 下单函数 自定义函数(笔记简单,但是需要重点看)

    @https://www.joinquant.com/view/community/detail/7570870ccf37ba48007261992d2e543a 一.函数 参数 聚宽设计的函数的用法 ...

  5. Python|函数——自定义函数

    语法规则: def 函数名(参数)--------可选 函数体 [return 返回值]   ------------可选 自定义函数 使用def定义 使用时,调用方法与内置函数一致 例题:计算半径是 ...

  6. matlab经典调用函数,Matlab怎么调用函数 自定义函数使用方法

    Matlab作为一款专业性极强的商业数学软件,将诸多的算法开发.统计分析.数据可视化功能融入其中,用户可以方便地调用需要的函数,建立数学模型,为了满足你工作的需要,还可以自行设置自己需要的函数,下面就 ...

  7. 关于MySQL的存储函数(自定义函数)的定义和使用方法详解

    存储函数 什么是存储函数: 封装一段sql代码,完成一种特定的功能,返回结果. 存储函数的语法: create function 函数([函数参数[,-.]]) Returns 返回类型 Begin ...

  8. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  9. mysql存储过程与自定义函数

    2019独角兽企业重金招聘Python工程师标准>>> #mysql存储过程与自定义函数: delimiter $ 1.最简单的存储过程 create procedure test( ...

最新文章

  1. django mysql orm教程_带你了解Django ORM操作(基础篇)
  2. [转]使用C#调用金诚信71x系列读卡器的DLL
  3. 天线巴伦制作和原理_一种基于LTCC技术的新型Marchand巴伦滤波器
  4. 计算机体系结构:嵌入式方法_计算机考研——计算机二级学科详解
  5. hashmap底层原理_Java集合 - HashMap原理(一) 概念和底层架构
  6. 做个插件MaterialSpinner笔记
  7. javascript 网页自动跳转
  8. 飞机大战(Java)
  9. 数据分析--数据的分组和聚合
  10. linux学习课程从入门到精通:Linux基本操作和服务器硬件选购指南
  11. 新型城镇化红利,碧桂园的确定性在哪里?
  12. 已解决:Word加载MathType时出现MathPage.wll或MathType.dll文件找不到
  13. Unity TimeLine丨A1.创建TimeLine、Animation Track,Extrapolation属性讲解
  14. python类型转换方法_详解python中的类型转换方法
  15. 数据可视化Echarts学习指南
  16. 【短视频 】 分享几个免费剪辑视频的软件
  17. seo需要注意哪些细节
  18. 一只蝴蝶挥了挥翅膀,于是有了AI读心术
  19. 读书笔记:Mysql实战45讲 (1-10讲)
  20. pfa100_pfa100_PFA 是什么意思?

热门文章

  1. 斯蒂芬·沃尔夫勒姆 | 圣塔菲研究所的初创故事
  2. java excel导出复杂表头_java excel复杂表头和复杂数据导出
  3. IINA 设置字幕缩放快捷键教程
  4. Altium Designer按图画图
  5. jQuery制作360换肤
  6. 威马汽车将赴港IPO:连续实现高速增长,股东阵容强大
  7. 听说国漫最近崛起了,那我们就来爬几部国漫看看(动态加载,反爬)
  8. 轮播图动态生成小圆点
  9. iphone11开机和关机
  10. Window10没有本地用户和组???