Python函数的学习总结

简介: Python函数的学习总结

1 函数的创建和调用

1.1 函数创建

  • 创建函数即定义函数
  • 使用关键字def实现
  • 语法:
def fname([pname]):
    ["comm"]
    [fuc]
  • 说明:
def:定义函数的,固定写法
fname:函数名
pname:参数,可选,指定向函数中传入的参数,若有多个的话,参数之间用逗号隔开
comm:可选,函数的注释,即说明函数的功能、传递的参数,提升代码可阅读性
fuc:函数体,可选,具体的函数功能,如有返回值,使用return()
comm和fuc必须要进行缩进显示
如果想定义空函数,函数体直接用pass作占位符即可
# -*- coding:utf-8 -*-

import random

def mgame(num):
    """
    模拟石头剪刀布游戏:
    :param num: 输入一个0-2之间的任意一个整数(0:石头、1:剪刀、2:布)
    :return: 返回输入的num以及计算机随机给的数值
    """
    computernum = random.randint(0, 2)
    if num == computernum:
        print("平局!")
    elif num == 0 and computernum == 1 or num == 1 and computernum == 2 or num == 2 and computernum == 0:
        print("我赢了!")
    else:
        print("计算机赢了")
    return num, computernum

结果:

D:\Python37\python.exe F:/python_study/main.py

进程已结束,退出代码 0

运行上边的代码,不显示任何内容,也不会抛出异常,因为函数没有调用!!!


1.2 函数调用

  • 函数调用即执行函数
  • 简单理解一下:函数就是实现某种功能或者用途的工具,而调用函数就是使用这个工具
  • 语法:
fname([pname])
  • 说明:
fname:函数名
panme:参数,根据函数的定义来确定传入参数的类型以及是否传入参数
# -*- coding:utf-8 -*-

import random

def mgame(num):
    """
    模拟石头剪刀布游戏:
    :param num: 输入一个0-2之间的任意一个整数(0:石头、1:剪刀、2:布)
    :return: 返回输入的num以及计算机随机给的数值
    """
    computernum = random.randint(0, 2)
    if num == computernum:
        print("平局!")
    elif num == 0 and computernum == 1 or num == 1 and computernum == 2 or num == 2 and computernum == 0:
        print("我赢了!")
    else:
        print("计算机赢了")
    return num, computernum

out = mgame(2) # 调用函数,因为这个函数定义了有返回值,所以调用函数后,并且把结果给out变量;因为函数定义的时候有一个参数num,所以调用的时候给了一个传入参数2
print(out) # 使出变量out的值

结果:

# 每次结果可能不一样,因为计算机是随机给的值,我这里运行了好几次,取了几个结果如下:
计算机赢了
(2, 1)
我赢了!
(2, 0)
平局!
(2, 2)

1.3 pass空语句

  • pass语句表示空语句,不做任何事情,一般起到占位符的作用
  • 怎么用呢?比如我们写一个函数,暂时不确定他的功能,可以使用pass来填充,告诉别人以后我会加上的,哈哈
def fname():
    pass
  • 在python中上边的pass可以使用三个连续的点来代替
def fname():
    ...

2 参数传递

如【1.2 函数调用】中的函数pname就是参数,但是参数也有两个:实际参数(实参)和形式参数(形参)

2.1 形式参数和实际参数

如何理解两个的区别?

  • 通过作用理解

① 就是通过她两的作用来定的,书本上是这么说的 ” 在定义函数时,函数名后边括号中的参数为【形式参数】,称形参;在调用函数时,函数名后边括号中的参数为【实际参数】,称实参“.......
②说实话上一句话,真没有理解!!!
在这里插入图片描述
③举个例子:

# 定义和创建函数的时候,这里的num就是形式参数
def test(num):
    print(num)

# 调用函数,此时的函数参数5,(11, 22, 33 44)就是实际参数
test(5)
test((11, 22, 33, 44))

结果:

5
(11, 22, 33, 44)

④根据实参的类型不同,可将实参的传递分为 【值转递】 和 【引用传递】,这里当然是把实参传递给形参了,怎么区分这两个概念呢?

A、当实参为不可变对象时,为值传递;
B、当实参为可变对象时,为引用传递;
C、本质区别为:值传递后,不会改变形参的值,实参的值也不变;引用传递后,改变形参的值,实参的值也改变。

**********************************
有点感觉了,貌似理解了!不过,还是不太清楚!
在这里插入图片描述

*********************************
⑤再举个例子:

# -*- coding:utf-8 -*-

def test(name):
    print("原来的值:", name)
    name += name

# 调用函数
print("=======1、开始进行值传递======")
mtr = "我们都有一个梦想,那就是明年不止挣一个亿!"
print("调用前:", mtr)
test(mtr)
print("调用后:", mtr)

print("=======2、开始进行引用传递======")
mlist = ["1个亿", "2个亿", "3个亿"]
print("调用前:", mlist)
test(mlist)
print("调用后:", mlist)

结果:

=======1、开始进行值传递======
调用前: 我们都有一个梦想,那就是明年不止挣一个亿!
原来的值: 我们都有一个梦想,那就是明年不止挣一个亿!
调用后: 我们都有一个梦想,那就是明年不止挣一个亿!
=======2、开始进行引用传递======
调用前: ['1个亿', '2个亿', '3个亿']
原来的值: ['1个亿', '2个亿', '3个亿']
调用后: ['1个亿', '2个亿', '3个亿', '1个亿', '2个亿', '3个亿']
  • 使用一个比喻来理解
函数定义时参数列表的参数就是形参,而函数调用时传递进来的参数就是实参,比如就像:
剧本中的角色就是形参,而演角色的演员就是实参。====这句话,不是我说的,来源课本!!

2.2 位置参数

  • 即必备参数,必须按照正确的顺序传到函数中
  • 即调用时的数量和位置必须和定义时时一样的

①数量必须与定义时一致

# -*- coding:utf-8 -*-
# 也就是说 在调用函数时,指定的实参数量与形参数量一致,否则会抛出异常TypeError

def test(num1, num2):
    sum = 0
    sum = num1 + num2
    print(sum)

test(1, 2)
test(2) # 这个会抛出异常,因为参数数量不一致

结果:

3
Traceback (most recent call last):
  File "F:/python_study/main.py", line 12, in <module>
    test(2)
TypeError: test() missing 1 required positional argument: 'num2'

②位置必须与定义时一致

# -*- coding:utf-8 -*-

# 也就是说 在调用函数时,指定的实参位置与形参位置一致,否则会抛出异常TypeError或者不抛异常,但是程序存在bug

def person(name, age, height):
    print(name, age, height)

person("小张", 18, 170)

# 位置换一下,如果类型不一样,虽然结果没有抛出异常,但是名字是18,年龄是小张,好像不合适,有bug
person(18, "小张", 170)

结果:

小张 18 170
18 小张 170

2.3 关键字参数

  • 即使用形参的名字来确定输入的参数值
  • 此方式指定实参时,无须与形参的位置完全一致,只需将参数名写正确即可
# -*- coding:utf-8 -*-

def person(name, age, height):
    print(name, age, height)

person(height=170, name="小张", age=18)

结果:

小张 18 170

2.4 为参数设置默认值

  • 即定义函数时,直接指定形式参数的默认值
  • 当没有传入参数时直接使用默认值
  • 语法:
def fname(pname=defaultname):
    [func]
  • 说明:
fname:函数名称
pname:参数,可选
defaultname:参数pname的默认值
func:函数体
# -*- coding:utf-8 -*-

def person(name="小张"):
    print(name)

person() # 没有传参,使用默认值
person("小李") # 传参了,使用传入的值

结果:

小张
小李
  • 可使用" 函数名.__ defaults__"来查看函数的默认值参数的当前值,结果为元组
# -*- coding:utf-8 -*-

def person(name="小张", age=18, height=172):
    print(name)

person() # 没有传参,使用默认值
person("小李") # 传参了,使用传入的值
print(person.__defaults__) # 查看函数参数的默认值

结果:

小张
小李
('小张', 18, 172)

2.5 可变参数

  • 即不定长参数
  • 即传入函数中的实参可为0个,1个,两个以及任意个
  • 定义可变参数的形式有两种:parameter 和 *parameter

① *parameter: 表示接收任意多个实参并将其放到元组中

# -*- coding:utf-8 -*-

def person(*name):
    print(name)
    for item in name:
        print(item)

person("小张", "小李", "老王", "隔壁老王") # 字符串直接写
person(*["小张", "小李", "老王", "隔壁老王"]) # 如果传入的可变参数时列表,需要在列表前加*号

结果:

('小张', '小李', '老王', '隔壁老王')
小张
小李
老王
隔壁老王
('小张', '小李', '老王', '隔壁老王')
小张
小李
老王
隔壁老王

② **parameter:表示接收任意多个显示赋值的实参,并将其放到一个字典中

# -*- coding:utf-8 -*-

def person(**name):
    print(name)
    for key, value in name.items():
        print(""+key+"的英文名为:", value)

person(小张="xiaozhang", 小李="xiaoli", 老王="laowang", 隔壁老王="gblw")

结果:

{'小张': 'xiaozhang', '小李': 'xiaoli', '老王': 'laowang', '隔壁老王': 'gblw'}
小张的英文名为: xiaozhang
小李的英文名为: xiaoli
老王的英文名为: laowang
隔壁老王的英文名为: gblw

到这一步,感觉可以歇歇了
在这里插入图片描述


3 返回值

  • 使用return语句为函数指定返回值
  • 无论return在什么位置,执行到return后,就会结束函数的执行
# -*- coding:utf-8 -*-

def name_to_xname(name):
    xname = ""
    if name == "小张":
        xname = "xiaozhang"
    elif name == "老王":
        xname = "laowang"
    elif name == "老李":
        xname = "laoli"
    elif name == "隔壁老王":
        xname = "gblw"
    else:
        print("输入的名字不存在,请重新输入以下内容中的一个:", ["小张", "老王", "老李", "隔壁老王"])
    return(xname)

while True:
    name = input("请输入以下名称中的任意一个,请输入:")
    xname = name_to_xname(name)
    print("{} 的英文名为:{}".format(name, xname))

结果:

请输入以下名称中的任意一个,请输入:小李
输入的名字不存在,请重新输入以下内容中的一个: ['小张', '老王', '老李', '隔壁老王']
小李 的英文名为:
请输入以下名称中的任意一个,请输入:小张
小张 的英文名为:xiaozhang
请输入以下名称中的任意一个,请输入:老王
老王 的英文名为:laowang
请输入以下名称中的任意一个,请输入:老李
老李 的英文名为:laoli
请输入以下名称中的任意一个,请输入:隔壁老王
隔壁老王 的英文名为:gblw

4 变量的作用域

  • 即程序代码能够访问该变量的区域
  • 根据变量的”有效范围“,将变量分为 局部变量 和 全局变量

4.1 局部变量

  • 即在函数内部定义并使用的变量,只在函数内有效
# -*- coding:utf-8 -*-

def love():
    love_to_you = "如果上天能再给我一次机会,我将对那个...(此处略去一万字!)"
    print("我是局部变量:", love_to_you)  # 打印这个局部变量

love()
print("这里打印会报错:", love_to_you)  # 如果在函数以外来打印这个局部变量就会报错

结果:

我是局部变量: 如果上天能再给我一次机会,我将对那个...(此处略去一万字!)

Traceback (most recent call last):
  File "F:/python_study/main.py", line 8, in <module>
    print("这里打印会报错:", love_to_you)  # 如果在函数以外来打印这个局部变量就会报错
NameError: name 'love_to_you' is not defined

4.2 全局变量

  • 即能够作用于函数内外的变量,有以下两种情况:

①变量在函数外定义,此变量可在函数外和函数内都可被访问到,即在函数体外定义的变量为全局变量

# -*- coding:utf-8 -*-

love_to_you = "曾经有一份真挚的爱情摆在我的面前,可是我没有珍惜,如果..."
love_recive = "没有如果,你活该,早知现在,何必当初!!"
love_to = "说实话,省略号后的内容,我是忘记怎么说了,哈哈哈"

def love():

    print("我是全局变量1:", love_to_you)  # 打印这个全部变量

def love_add():
    love_to_you_add = love_to_you + love_recive
    print("我是全局变量2:", love_to_you_add)

love()
love_add()

print("我是全局变量3:", love_to)

结果:

我是全局变量1: 曾经有一份真挚的爱情摆在我的面前,可是我没有珍惜,如果...
我是全局变量2: 曾经有一份真挚的爱情摆在我的面前,可是我没有珍惜,如果...没有如果,你活该,早知现在,何必当初!!
我是全局变量3: 说实话,省略号后的内容,我是忘记怎么说了,哈哈哈

②在函数体内定义,使用关键字global修饰后的变量为全局变量,可在函数外调用,函数体内修改

# -*- coding:utf-8 -*-

def speak():
    global speak_to_all
    speak_to_all = "他大舅他二舅都是他舅,"
    print("全局变量1:", speak_to_all)

def speaks():
    global speak_to_one
    speak_to_one = "高桌子低板头都是木头"
    print("全局变量2:", speak_to_one)

def speakss():
    global speak_to
    speak_to = speak_to_all + speak_to_one

speak()
speaks()
speakss()
print("直接在外部调用全局变量1:", speak_to_all)
print("直接在外部调用全局变量2:", speak_to_one)
print("直接在外部调用全局变量3:", speak_to)

结果:

全局变量1: 他大舅他二舅都是他舅,
全局变量2: 高桌子低板头都是木头
直接在外部调用全局变量1: 他大舅他二舅都是他舅,
直接在外部调用全局变量2: 高桌子低板头都是木头
直接在外部调用全局变量3: 他大舅他二舅都是他舅,高桌子低板头都是木头

5 匿名函数

  • 即没有名字的函数
  • 应用在需要一个函数、但又不想去命名这个函数的场合
  • 一般,这样的函数只会使用一次
  • 可使用lambda表达式创建匿名函数
  • 语法:
result = lambda[arg1[,arg2,......,argn]]:exp
  • 说明:
result :调用lambda表达式
[arg1[,arg2,......,argn]]:可选参数,指定要传递的参数列表,多参数间用逗号隔开
exp:必选参数,用于实现具体功能的表达式
# -*- coding:utf-8 -*-

def nsum(a, b):
    sums = a + b
    print(sums)

def lsum(c, d):
    lsum = lambda c,d:(c+d)
    print(lsum(c, d))

print("======普通方法计算两个数之和======")
nsum(100, 200)
print("======lambda计算两个数之和======")
lsum(100, 200)

结果:

======普通方法计算两个数之和======
300
======lambda计算两个数之和======
300

6 常用python内置函数

  • python内置,直接调用使用即可

python3.7中69个内置函数,点击此处查看

内置函数

abs()

delattr()

hash()

memoryview()

set()

all()

dict()

help()

min()

setattr()

any()

dir()

hex()

next()

slice()

ascii()

divmod()

id()

object()

sorted()

bin()

enumerate()

input()

oct()

staticmethod()

bool()

eval()

int()

open()

str()

breakpoint()

exec()

isinstance()

ord()

sum()

bytearray()

filter()

issubclass()

pow()

super()

bytes()

float()

iter()

print()

tuple()

callable()

format()

len()

property()

type()

chr()

frozenset()

list()

range()

vars()

classmethod()

getattr()

locals()

repr()

zip()

compile()

globals()

map()

reversed()

__import__()

complex()

hasattr()

max()

round()

在这里插入图片描述

目录
相关文章
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
323 1
|
2月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
189 1
|
2月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
292 1
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
167 0
|
3月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
275 101
|
3月前
|
缓存 测试技术 Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
223 99
|
3月前
|
存储 缓存 测试技术
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
194 98
|
3月前
|
缓存 Python
Python中的装饰器:优雅地增强函数功能
Python中的装饰器:优雅地增强函数功能
|
4月前
|
Python
Python 函数定义
Python 函数定义
541 155
|
2月前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
168 4

推荐镜像

更多