python成长之路【第三篇】:函数

1、函数基础
  函数是python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构。
  函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件。
  函数用于将相关功能打包并参数。
  python中可以创建4种函数:
    全局函数:定义在模块中
    局部函数:嵌套于其他函数中
    lambda函数:表达式
    方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用
  Python提供了很多内置函数。

  注意:有两种方式可以查看Python的内置函数。

    1、https://docs.python.org/3/library/functions.html

    2、交互式模式下:help(__builtins__)

2、创建函数
语法:
  def functionName(parameters):
    suite

一些相关的概念:
  def是一个可执行语句。因此可以出现在任何能够使用语句的地方,甚至可以嵌套于其他语句,例如if或while中。
  def创建了一个对象并将其赋值给一个变量名(即函数名)。
  return用于返回结果对象,其为可选;无retrun语句的函数自动返回None对象。返回多个值时,彼此间使用逗号分隔,且组合为元组形式返回一个对象。
  def语句运行之后,可以在程序中通过函数后附加括号进行调用。

  2.1、文档化参数
  如果想要给函数写文档,让其他使用该函数人能理解的话,可以加入注释(以#开头)。另外一个方式就是直接写上字符串。这类字符串在其他地方可能会非常有用,比如在def语句后面(以及在模块或者类的开头)。如果在函数的开头写下字符串,它就会作为函数的一部分进行存储,这称为文档字符串。

  示例:

def square(x):
‘Calculates the square of the number x.‘
return x*x

  文档字符串可以按如下方式访问:
    square.__doc__
  注意:__doc__是函数属性。属性中的双下划线表示它是个特殊属性。

  

  2.2、参数传递:参数的传递是通过自动将对象赋值给本地变量实现的。

  

  不可变参数通过"值"进行传递:
    在函数内部改变形参的值,只是让其引用了另一个对象。
  可变参数通过"指针"进行传递:
    在函数内部改变形参的值,将直接修改引用的对象。

  有两种方式可避免可变参数被函数修改:
    直接传递可变对象的副本:testFunc(A,B[:])
    在函数内部创建可变参数的副本:B=B[:]

示例:
	可变参数:
	>>> l1 = [1,2,3]
	>>> def f1(x):
	...     x.pop()
	...     print(x)
	...
	>>> f1(l1)  #这里我们发现当调用函数f1时,会修改列表l1的值。是他们他们都是指向相同的引用。
	[1, 2]
	>>> l1
	[1, 2]

	不可变:
	>>> l1 = [1,2,3]
	>>> def f1(x):
	...     x.pop()
	...     print(x)
	...
	#注意我们这里调用参数的方法l1[:]相当于对列表l1做了一次全拷贝,所以他们没有指向相同的引用。
	>>> f1(l1[:])
	[1, 2]
	>>> l1
	[1, 2, 3]

  2.3、函数参数模型
  默认情况下,参数通过其位置进行传递,从左至右,这意味着,必须精确地传递和函数头部参数一样多的参数。但也可以通过关键字参数、默认参数或者参数容器等改变这种机制。
    位置参数:从左至右
    关键字参数:调用函数时,使用"name=value"的语法通过参数名进行匹配
    默认参数:定义函数时使用"name=value"的语法直接给变量一个值,从而传入的值可以少于参数个数
      def f1(x,y,z=9)
    可变参数:定义函数时使用*开头的参数,可用于收集任意多基于位置或关键字的参数
      def f1(*x):把收集到的结果都当成元组来识别
      def f1(**x):把收集到的结果都当成字典来识别
    可变参数解包:调用函数时,使用*开头的参数,可用于将参数集合打撒,从而传递任意多基于位置或关键字的参数

  注意:调用函数时,如果混用位置参数和关键字参数时,左侧先写所有位置参数,然后在写所有的关键字参数。
    定义函数时使用有默认值的参数时:形参放左边,有默认值的参数放右边。
    调用函数时使用可变参数要求:
      定义函数时使用*:收集位置参数
      定义函数时使用**:收集关键字参数

示例:
	可变参数,用于收集位置参数,返回结果为元组
	>>> def f10(*x):
	...     print(x)
	...
	>>> m = 3
	>>> n = 5
	>>> o = 9
	>>> f10(m)
	(3,)
	>>> f10(m,o)
	(3, 9)
	>>> 

	可变参数,用于收集关键字参数,返回结果为字典。
	>>> def f11(**x):
	...     print(x)
	...
	>>> f11(x=1,y=5,z=9)
	{‘z‘: 9, ‘x‘: 1, ‘y‘: 5}

	可变参数解包:必须匹配
	>>> l1 = ["Sun","Mon","Tus"]
	>>> x,y,z = l1
	>>> print(x,y,z)
	Sun Mon Tus

	示例:
	>>> l1 = ["Sun","Mon","Tus"]
	>>> def f1(x,y,z):
	...     print(x,y,z)
	...
	>>> f1(*l1)
	Sun Mon Tus

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

  

  函数变量作用域:LEGB原则

    作用域越小,优先级越多。

  

时间: 2024-10-14 14:08:50

python成长之路【第三篇】:函数的相关文章

python成长之路第三篇(1)_初识函数

目录: 函数 1.为什么要使用函数 2.什么是函数 3.函数的返回值 4.文档化函数 5.函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多代码是重复利用的,这样会使我们的代码变得异常臃肿,比如说: 我们要写一个验证码的功能 例子: 比如说我们要进行一些操作,而这些操作需要填写验证码 验证码代码:  1 import random   2 number_check = ''   3 for i in range(0,

python成长之路第三篇(2)_正则表达式

打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表达式相信很多人都熟悉了,在python中正则表达式的支持是通过re(regular expression)模块,正则表达式是可以匹配文本片段的模式,简单的是正则表达式就是普通的字符串,可以处理字符串.也就是说正则表达式的存在就是来处理文本字符串的 下面来熟悉下正则中的几个概念: 1.通配符 通配符是

python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作

打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-hashlib 7.with文件操作 代码执行环境默认为3.5.1 一.作用域 (1)什么是作用域,官方来说作用域就是就是有不同的命名空间,就像下面的代码一样,a=1它的作用域是全局的,也在全局的命名空间当中,当函数 action中的a=2它就在局部的作用域中,也在局部的命名空间当中. a = 1def

我的Python成长之路---第三天---Python基础(12)---2016年1月16日(雾霾)

四.函数 日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现.在编程的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代码调用. 假设我们在编程过程中需要计算圆形的面积.如果我们不是用函数,每次需要计算原型面积的时候都需要这样 1 r1 = 12.34 2 r2 = 9.08 3 r3 = 73.1 4 s1 = 3.14 * r1 * r1 5 s2 = 3.14 * r2 * r2 6 s3 = 3.14 * r

python成长之路【第九篇】:网络编程

一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Communication,IPC).有两种类型的套接字:基于文件的和面向网络的. 第一种:基于文件的 因为两个进程运行在同一台计算机上,所以这些套接字都是基于文件的,这意味着文件系统支持他们的底层基础结构.这是能够说的通的,因为文件系统是一个运行在同一个主机上的多个进程之间的共享常量.第二种:基于网络的 基于

Python成长之路【第二篇】Python基础之数据类型

阅读目录 简介 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型,复数) 字符串 列表 元组 字典 集合 4 如何学习 #一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 可以存多个值,值都可以是什么类型 2 有序or无序 3 可变or不可变 !!!可变:值变,id不变.可变==不可hash

我的Python成长之路---第三天---Python基础(13)---2016年1月16日(雾霾)

五.Python的常用的内置函数 Python为我们准备了大量的内置函数,如下图所示 这里我们只讨论红框内的内置函数 abs(x) 返回一个数的绝对值(模),参数可以是真说或浮点数 >>> abs(-10) 10 all(iterable) 如果可迭代对象(列表.元祖等)中所有的元素都是True,则返回True,否则返回False.相当于and >>> all([1, True, 1 == 1]) True any(iterable) 如果可迭代对象中任意一个元素是Tr

python学习之路-第三天-函数

函数 函数的定义关键字:def 使用global语句可以清楚地表明变量是在外面的块定义的 示例:(函数运行完毕后x的值是2) #!/usr/bin/python # Filename: func_global.py def func(): global x print 'x is', x x = 2 print 'Changed local x to', x x = 50 func() print 'Value of x is', x 可以给形参加上默认值,默认参数是不可变的,而且只有在形参表末

我的Python成长之路---第三天---Python基础(9)---2016年1月16日(雾霾)

一.集合 set和dict类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在set中,没有重复的key. 集合和我们数学中集合的概念是一样的,也有交集,并集,差集,对称差集等概念 1.集合的定义 定义一个集合需要提供一个列表作为参数,也可以不传入参数创建一个空的集合 >>> s = set([1, 2, 2, 3]) >>> s {1, 2, 3} # 可以看到在创建集合对象对过程中已经为我们把重复的元素剔除掉了 >>> s

Python 学习之路(三)

Python 学习之路(三) 以下所用的是Python 3.6 一.集合部分 集合是一个无序的,不重复的数据集合,主要用来去重,以及关系测试:交集,差集,并集等 1.1 关系操作 1.1.1 列表去重 可以给列表去重,例如: 1 set_demo = [1,2,3,4,5,3,2,1] # 列表 2 set_demo = set(set_demo) # 转换成集合,来去重 3 print(set_demo) 1.1.2 取交集 intersection()方法 可以获得两个集合的交集部分,例如: