首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

每日一记:Python 函数学习笔记1

Python函数概述、使用函数,函数定义、函数返回,函数参数。

几乎每种编程语言都有函数,Python中函数也是非常重要的内容。简单讲函数就是一段代码,然后我们给这段代码起个名字,通过名字来使用这段代码(调用)。

为什么需要函数呢?

看个例子,当我们程序中多个地方都要使用功能相同的一段代码时怎么处理呢?是每个使用这段代码的地方都复制一份吗?如图:

图:代码复制与复用

从例子我们可以看到,简单考虑有两种想法:一是每个用到的地方都复制一份;二是把这段代码放到一个地方,使用时都执行这段代码,这段代码执行完毕,继续执行其他处理。

如果把代码复制多份:

1、增加了代码量(占用更多的内存);

2、如果需要修改代码,比如把 a > b 改成 a>

方法二改善了这种情况,方法二的缺点是增加代码的跳转,对于流水线执行的指令来讲,会降低效率,这种降低大多数情况可以忽略不计,整体而言优点大于缺点。采用函数就可以实现方法二的效果。

函数作用:代码模块化设计,提高可读性;提高代码复用率;提高开发效率;使代码便于维护,降低出错率等等。

Python函数也是对象(一切皆对象),具有可执行属性,函数名就是一个变量,绑定到函数对应的代码。

关于Python函数主要需要了解:定义函数(创建对象),使用函数(调用)两方面内容。

Python 函数分类:Python函数可分为,Python内建函数、开发者自己编写的函数、其他开发者编写的函数。另外,Python中对象的方法其实也是函数。

使用函数称为函数调用,调用函数需要遵循函数的使用规则。如之前使用过的函数:

print("Hello Python")

r = len([1, 2, 3])

a = [1, 2, 3]

a.append(4)

print(),len(), a.append() 都是函数,上面都是函数调用。

Python函数的几个要素:函数名、函数参数、函数返回值。

Python使用关键字 def 定义函数。

ŸPython自定义函数语法:

def 函数名 (参数列表):

"函数文档字符串"

函数语句块

1、def 必须写(大小写一致)

2、函数名要有,用户自定义,命名规则同变量(标识符命名规则),通常建议:小写字母+下下划线,如: goods_add()

3、() 必须有,英文

4、: 必须有,英文

5、参数列表:可选

6、"函数文档字符串":可选,如有需要缩进

7、语句块:至少一条语句,可以使用pass,需要缩进

代码示例:

不带参数

def hello():

print("hello 1")

print("hello 2")

print("hello 3")

带参数

def test(a, b):

print(a + b)

调用语法:

[变量] = 函数名([实参列表])

变量 =:可选,需要接收函数返回值时,否则 变量 = 均不需要。

函数名:必须有,需要和定义时一致包括大小写。

实参列表:可选,这个情况多些,后续说明。

示例:

print("Hello Python")

r = len([1, 2, 3])

a = [1, 2, 3]

a.append(4)

几点说明:

1、定义是函数创建对象(可执行对象,callable()),并不执行

2、调用时执行,从调用处跳转到函数代码

3、函数执行到最后一条语句则返回调用处,继续执行下一条语句,或者执行到return 语句结束执行,返回调用处,继续执行下一条语句。

示例2:

def my_test(a, b):

print(a + b)

my_test(10, 20)

x = 100

y = 20

my_test(x, y)

函数返回语句,只要执行到return语句,函数即结束运行,返回调用处。

return 语句语法:

return [表达式]

表达式:可选,有表示函数返回的值(对象),可以是 None,没有时等同None。

示例

无返回值

def say_hello2():

print("hello aaa")

print("hello bbb")

return

print("hello ccc")

有返回值

def fun2():

print("fun2()函数的第一行被执行")

return [1,2,3]

print("fun2()函数的最后一行被执行")

返回多个值

def fun1():

a = 100

b = 50

return (a – b), (a + b)

带参数的函数定义举例

def my_add(a, b):

return (a+b)

a = my_add(1, 2)

几点说明:

定义函数时,需要确定函数名和参数个数

参数可以没有(根据需要确定)

如果有必要,可以检查参数的合法性(后续讲解)

函数必须先定义,再使用

Python函数声明和定义可以看作一回事

函数体内部可以使用 return

return 可以返回值,有可以不返回值

return 可以随时出现函数体中,执行return即返回,后续语句不再执行

函数执行完毕也没有return语句时,自动 return None

函数可以同时返回多个值,但其实就是一个元组。

Ÿ形参与实参的概念:

函数定义时,参数列表中的参数为形式参数

函数调用时,给定的参数为实参

图-形参实参

Python函数参数传递:

传递方式有,位置传参、序列传参;

关键字传参、字典关键字。

调用函数时,给定的实参个数和位置均需和定义时的形参相符。

示例1:

def my_func(x, y):

print("x is", x)

print("y is", y)

my_func(100, 200)

my_func(200, 100)

示例2:

def myfun1(a, b, c):

"这是一个函数参数的示例"

print("a的值是", a)

print("b的值是", b)

print("c的值是", c)

myfun1(1,2,3) # 1->a, 2->b, 3->c

myfun1(4,5,6) # 4->a, 5->b, 6->c

计算3-2的结果

def my_sub(x, y):

return x – y

以下函数调用得到什么结果?

my_sub(3, 2) #?

my_sub(2, 3) #?

my_sub() #?

my_sub(3) #?

Ÿ位置传参(序列传参:元组传参,*())

元组元素个数和参数个数相同

对应位置上的元素类型和函数参数类型相同

def my_sub(x, y):

return x - y

试验以下调用结果:

my_sub(*(3,2))

my_sub(*(2,3))

my_sub(*(2,3,4)) #?

my_sub(*(2)) #?

Ÿ位置传参(序列传参:列表传参,*[])

def my_sub(x, y):

return x - y

试验以下调用结果:

my_sub(*[3,2])

my_sub(*[2,3])

my_sub(*[2,3,5]) #?

my_sub(*[2]) #?

Ÿ位置传参(序列传参:字符串传参,*字符串)

def print_str(a1, a2):

print("a1是", a1)

print("a2是", a2)

测试以下调用结果:

print_str(*"AB")

print_str(*"ABC") #?

print_str(*"A") #?

关键字传参是从调用角度来说的,调用函数时以名字给形参传递实际的对象值

调用时实参和形参按名字匹配,不按位置匹配。

代码示例

def print_str(a, b, c):

print ("a 是", a)

print ("b 是", b)

print ("c 是", c)

测试以下调用:

#位置传参

print_str(1, 2, 3)

#关键字传参

print_str(b = 2, c = 3, a = 1)

print_str(c = 3, a = 1, b = 2)

print_str(1, c = 3, b = 2)

#正确?

print_str(c = 3, a = 1)

Traceback (most recent call last):

File "

", line 1, in

print_str(c = 3, a = 1)

TypeError: print_str() missing 1 required positional argument: 'b'

print_str(a=1, 2, 3)

File "", line 1

SyntaxError: positional argument follows keyword argument

print_str(1, c = 3, 2)

SyntaxError: positional argument follows keyword argument

Ÿ关键字参数(通过字典进行传参 **字典)

def print_str(a, b, c):

print ("a 是", a)

print ("b 是", b)

print ("c 是", c)

d = {"b":2,"c":3,"a":1}

print_str(**d)

函数位置传参和序列传参可以混合使用,个数,类型

print_str(100, *[200, 300]) # 正确

print_str(*[100, 200], 300) # 正确

print_str(*[100], *[200], *[300]) # 正确

print_str(*[100], 200, *[300]) # 正确

print_str(*[100], 200, *[300]) # 正确

函数位置传参和关键字参数传参可以混合使用

print_str(100, c = 300, b = 200) # 正确

print_str(c = 300, b = 200, 100) # 错误

函数位置传参和字典传参可以混合使用

print_str(100, **{"c" : 300, "b" : 200})

print_str(**{"c" : 300, "b" : 200}, a=100)

在实参能唯一匹配到相应形参的情况下可以任意组合

未完,待续。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180223A0IC4400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券