python函数的定义与使用

简介:

一、函数的定义与创建

  函数是 Python 为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构;它能让程序员将

复杂的系统分解为可管理的部件。Python中可以创建四种函数:

全局函数:定义在模版中
局部函数:嵌套在其他函数中
Lambda函数:又称匿名函数,表达式
方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用
  • 定义函数语法

def functionName(parameters):
    suite
return value

 def是一个可执行语句,因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其他语句,例如 if 或 whiledef 创建了一个对象并将其赋值给一个变量名(即函数名)return用于返回结果对象,其为可选;returne语句的函数自动返回none对象;def 语句运行之后,可以在程序中通过函数后附加括号进行调用。

In [2]: def make_a_sound():
   ...:     print('quack')
   ...:     
In [3]: make_a_sound()
quack
In [4]: a=make_a_sound()
quack
In [5]: type(a)
Out[5]: NoneType

  上面是一个最简单的无参数函数,对其调用后python会执行函数内部代码。此函数会打印输出一个单词,由于没有设置返回值,因此默认为NoneType。

  • 参数传递形式

  当定义的函数有参数时,参数传递有两种形式。

  位置参数:从左向右,传入的参数值按顺序一次复制进去 

  关键字参数:调用参数时按关键名称匹配,无需关心函数定义时参数的位置

  混用上面两种方式时:先写所有位置参数,然后所有的关键字参数
In [6]: def menu(wine,entree,dessert):     
   ...:     return{'wine':wine,'entree':entree,'dessert':dessert}
   ...:     
In [7]: menu('chardonnay','chicken','cake')      #依次传递参数,位置参数
Out[7]: {'dessert': 'cake', 'entree': 'chicken', 'wine': 'chardonnay'}
In [8]: menu(entree='beef',dessert='bagel',wine='bordeaux') #按关键字传递参数
Out[8]: {'dessert': 'bagel', 'entree': 'beef', 'wine': 'bordeaux'}

 定义函数时可以为参数设置默认的参数值,当调用函数没有指定参数值时就会使用此默认值。定义时无默认值的参数在左边,有默认值的参数在右边。

In [9]: def menu(wine,entree,dessert='pudding'):
   ...:     return{'wine':wine,'entree':entree,'dessert':dessert}
   ...:     
In [10]: menu('chardonnay','chicken')
Out[10]: {'dessert': 'pudding', 'entree': 'chicken', 'wine': 'chardonnay'}

  当定义函数无法确定参数的具体个数时,可以使用可变参数来收集参数,动态参数有两种形式:一种是收集位置参数,另一种是收集关键字参数。

  定义函数时使用*: 收集位置参数 (元组)
  定义函数时使用**: 收集关键字参数 (字典)
In [12]: def print_args(*args):     #使用*收集位置参数
    ...:     print('positional argument tuple:',args)
    ...:     
In [13]: print_args()
positional argument tuple: ()
In [14]: print_args(1,2,3,4,5,6,'12131','abcd')
positional argument tuple: (1, 2, 3, 4, 5, 6, '12131', 'abcd')
In [15]: def print_kwargs(**args):  #使用**收集关键字参数
    ...:     print('Keyword arguments:',args)
    ...:     
In [16]: print_kwargs(wine='merlot',entree='mutton')
Keyword arguments: {'wine': 'merlot', 'entree': 'mutton'}
  • 函数作用域

  Python创建、改变或查找变量名都是在名称空间中进行;在代码中变量名被赋值的位置决定了其能被访问的范围;函数定义了本地作用域,而模块定义了全局作用域。
  每个模块都是一个全局作用域,因此,全局作用域的范围仅限于单个程序文件。每次对程序的调用都会创建一个新的本地作用域,赋值的变量除非声明为全局变量,否则均为本地变量。所有的变量名都可以归纳为本地、全局或者内置(__builtin__模块提供)。

变量名引用分三个作用进行:首先本地变量、接着全局变量、最后内置变量。

In [17]: animal='fruitbat'     #定义全局变量
In [18]: def print_global():
    ...:     print('inside print_global:',animal)  #调用全局变量
    ...:     
In [20]: print_global()
inside print_global: fruitbat

In [21]: def print_global():   #当函数想改变全局变量时,执行函数会报错
    ...:     print('inside print_global:',animal)
    ...:     animal='wombat'
    ...:     print('after the change:',animal)
    ...:     
In [22]: print_global()
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-22-e3810348dd19> in <module>()
----> 1 print_global()
<ipython-input-21-906f76821837> in print_global()
      1 def print_global():
----> 2     print('inside print_global:',animal)
      3     animal='wombat'
      4     print('after the change:',animal)
      5 
UnboundLocalError: local variable 'animal' referenced before assignment

In [27]: def print_global():   #在函数内部声明全局变量,再更改时函数可以执行
    ...:     global animal
    ...:     print('inside print_global:',animal)
    ...:     animal='wombat'
    ...:     print('after the change:',animal)
    ...:     
    ...:     
    ...:     
In [28]: print_global()
inside print_global: wolf
after the change: wombat
  • lambda()函数

  在python中,lambda函数是用一个语句表达式的匿名函数,可以用它代替小的函数。

语法:lambda args: expression

  args: 以逗号分隔的参数列表

  expression:用到 args 中各参数的表达式

  Lambda 语句定义的代码必须是合法的表达式,不能出现多条件语句(可使用if的三元表达式)和其他非

表达式语句,如forwhile等;Lambda 的首要用途是指定短小的回调函数;Lambda将返回一个函数而不

是将函数赋值给某个变量。

  需要注意的是:Lambda 是一个表达式而不是语句;lambda是单个表达式,而不是代码块Def语句创建

的函数将赋值给某变量名,而lambda 表达式则直接返回函数Lambda也支持使用默认函数。

In [29]: f=lambda x,y,z:x+y+z    #使用lambda匿名函数求和
    ...: 
    ...:     
In [30]: f(4,5,6)
Out[30]: 15

In [31]: f=lambda x,y,z=10:x+y+z
    ...: 
    ...: 
    ...:     
In [32]: f(3,7)
Out[32]: 20

In [33]: stairs=['thus','meow','thud','hiss']
In [34]: f=lambda word: word.capitalize() +'!'  #创建lambda函数将字符串大写
In [37]: for i in stairs: 
    ...:     print(f(i))
    ...:     
    ...:     
Thus!
Meow!
Thud!
Hiss!
  • 函数式编程

  也称作泛函编程, 是一种编程范型;他将电脑运算视作为数学上的函数计算,并且避免状态以及可

数据;函数式编程语言最重要的基础是lamdba 演算,而且 lambda 演算的函数可以接受函数当作输入输

出。python支持有限的函数式编程:

filter(function or None, iterable) 调用一个布尔函数function来迭代遍历每个iterable中的元素,返回一个使function返回值为真的元素序列。
map(func, *iterables) 将函数func作用域给定序列的每一个元素,并用一个列表来提供返回值,如果function为none,func表现为一个身份函数,返回一个含有每个序列中元素集合的n个元组的列表。

reduce(func,seq[,init]) 

(python3中废弃)

将二元函数作用域seq序列中的元素,每次携带一对(先前的结果以及下一个序列元素),连续地将现有的结果和下一个值作用在获得的随后结果上,最后减少序列为一个单一的返回值;如果出事值给定,第一个比较会是init和第一个序列元素而不是序列的两个头元素。

wKiom1jbghGxy50ZAADGp4re_rs512.png-wh_50

In [42]: li=[x for x in range(10) ]
In [43]: li
Out[43]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [44]: new_list=map(lambda a:a+10,li)    #使用map函数对li列表中没个元素加10
In [45]: new_list
Out[45]: <map at 0x7fd595189828>
In [46]: list(new_list)
Out[46]: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

wKioL1jbghHgS50aAACjh6FJkXY033.png-wh_50

 

In [48]: new_list2=filter(lambda arg:arg>5,li) #选出列表li中所有大于5的元素
In [49]: list(new_list2)
Out[49]: [6, 7, 8, 9]
  • 函数的设计规范

耦合性:

  (1)通过参数接受输入, 以及通过 return 产生输出以保证函数的独立性;

  (2)尽量减少使用全局变量进行函数间通信;

  (3)不要在函数中修改可变类型的参数;

  (4) 避免直接改变定义在另外一个模块中的变量;

聚合性:

  每个函数都应该有一个单一的、 统一的目标; 每个函数的功能都应该相对简单。



本文转自 梦想成大牛 51CTO博客,原文链接:http://blog.51cto.com/yinsuifeng/1911497,如需转载请自行联系原作者

相关文章
|
2月前
|
PHP Python
Python format()函数高级字符串格式化详解
在 Python 中,字符串格式化是一个重要的主题,format() 函数作为一种灵活且强大的字符串格式化方法,被广泛应用。format() 函数不仅能实现基本的插入变量,还支持更多高级的格式化功能,包括数字格式、对齐、填充、日期时间格式、嵌套字段等。 今天我们将深入解析 format() 函数的高级用法,帮助你在实际编程中更高效地处理字符串格式化。
240 0
|
2月前
|
索引 Python 容器
[oeasy]python096_列表_计数函数_count
本教程详细介绍了Python中列表的计数方法`count`,包括其基本用法、与`len`函数的区别,以及如何结合索引操作查找和删除特定元素。同时探讨了字符串对象的`count`方法,并通过实例演示了如何统计字符出现次数。
52 7
|
2月前
|
机器学习/深度学习 数据处理 索引
Python内置函数:面试通关的49个秘密武器
本文精选49个Python高频面试内置函数,涵盖数值处理、类型转换、序列操作、字典集合、函数式编程及高级特性,结合真实代码案例解析底层逻辑与应用场景,助你提升开发效率,轻松应对技术面试。
56 1
|
1月前
|
数据采集 索引 Python
Python Slice函数使用教程 - 详解与示例 | Python切片操作指南
Python中的`slice()`函数用于创建切片对象,以便对序列(如列表、字符串、元组)进行高效切片操作。它支持指定起始索引、结束索引和步长,提升代码可读性和灵活性。
|
5月前
|
人工智能 索引 Python
[oeasy]python091_列表_索引_index_中括号_索引函数
本文介绍了Python中列表与字符串的索引及index函数用法。通过range生成列表,使用索引[]访问和修改列表元素,index函数查找元素位置。字符串支持索引访问但不可直接修改。还探讨了16进制数在Python中的表示方法,以及日期、月份等特殊字符的Unicode范围。最后总结了列表与字符串操作的区别,并预告后续内容,提供蓝桥云课、GitHub和Gitee链接供进一步学习。
113 20
|
3月前
|
API Python
Python 的内建函数
Python 的内置函数列表,方便查询使用方法。
|
3月前
|
数据采集 自然语言处理 搜索推荐
Python内置函数ord()详解
`ord()` 是 Python 中用于将单个字符转换为对应 Unicode 码点的核心函数,支持 ASCII、多语言字符及特殊符号。其返回值为整数(范围 0-1114111),适用于字符编码验证、数据清洗、自定义排序、基础加解密等场景。使用时需注意参数长度必须为 1,否则会触发 `TypeError`。结合 `chr()` 函数可实现双向转换,进阶技巧包括多字节字符处理、编码范围检测及字符分类验证等。
|
5月前
|
Python
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
112 17
|
5月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
117 11
|
5月前
|
开发框架 Java .NET
Python中main函数:代码结构的基石
在Python中,`main`函数是程序结构化和模块化的重要组成部分。它实现了脚本执行与模块导入的分离,避免全局作用域污染并提升代码复用性。其核心作用包括:标准化程序入口、保障模块复用及支持测试驱动开发(TDD)。根据项目复杂度,`main`函数有基础版、函数封装版、参数解析版和类封装版四种典型写法。 与其他语言相比,Python的`main`机制更灵活,支持同一文件作为脚本运行或模块导入。进阶技巧涵盖多文件项目管理、命令行参数处理、环境变量配置及日志集成等。此外,还需注意常见错误如全局变量污染和循环导入,并通过延迟加载、多进程支持和类型提示优化性能。
382 0

热门文章

最新文章

推荐镜像

更多