Python 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

实例

def sayHello(name):
return "Hello:{0}".format(name)

这是一个非常简单的Python函数,接受一个参数,然后返回。

函数的调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

如下实例调用了sayHello()函数:

#定义函数
def sayHello(name):
return "Hello:{0}".format(name) #调用函数
print(sayHello("jiming"))

输出结果为:

所有参数在Python里都是按引用传递,如果你在函数内部修改了参数,那么原始的参数也被改变了

例如:

myList = [1,2,3]

print("修改前myList值:",myList)

def changeMyList(list):
myList[0:] = [3,2,1]
print("函数内修改后myList值:",myList) changeMyList(myList) print("函数外修改后myList值:",myList)

在上述代码中,我们在函数内将myList的值改为3,2,1,代码执行结果为:

注意:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。

我们来做个测试:

Money = 2000

print("修改之前函数外Money值:{0}".format(Money))

def AddMoney(_money):
_money +=1
print("修改之后函数内Money值:{0}".format(Money)) AddMoney(Money)
print("修改之后函数外Money值:{0}".format(Money))

结果为:

看到了吧,Money的值确实没有改变,因为当你想修改不可更改的对象时,其实就开辟了一个新的存储空间新的对象。

函数的参数

以下是调用函数时可使用的正式参数类型:

  • 必备参数
  • 关键字参数
  • 默认参数
  • 不定长参数

1、必备参数

必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

调用sayHello()函数,你必须传入一个参数,不然会出现语法错误.

2、关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。我们把sayHello改成需要传入两个参数的函数:

#定义函数
def sayHello(name1,name2):
return "Hello:{0} and {1}".format(name1,name2) print (sayHello(name2="jiming2",name1="jiming1"))

以上代码name1和name2的传入顺序和函数的定义不一致,但是我们使用关键字name1\name2进行了限定,因此函数还是能够正确读取对应的参数的

3、缺省参数

调用函数时,缺省参数的值如果没有传入,则被认为是默认值。这个和C#的缺省参数是一样的,例如:

#定义函数
def sayHello(name1,name2="jiming2"):
return "Hello:{0} and {1}".format(name1,name2) print (sayHello("jiming1"))

输出的结果为:

如果我们把name1改为缺省参数,而name2为必备参数的时候,代码还能正确运行吗?

#定义函数
def sayHello(name1="jiming1",name2):
return "Hello:{0} and {1}".format(name1,name2) print (sayHello("jiming2"))

编译器汇报如下错误:SyntaxError: non-default argument follows default argument

也就是说,我们把必备参数放到缺省参数的后面,会产生歧义

4、不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:

def functionname([formal_args,] *var_args_tuple ):
"函数_文档字符串"
function_suite
return [expression]

实例

#定义函数
def sayHello(sayPerson,*allPersons):
for p in allPersons:
print("{0} say :'Hello:{1}'".format(sayPerson, p)) sayHello("jiming","friend1","friend2","friend3")

输出结果为:

为了避免歧义,不定长参数也应该放到方法参数的最后一个

匿名函数

python 使用 lambda 来创建匿名函数。

  • lambda只是一个表达式,函数体比def简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

实例:

sum = lambda arg1, arg2: arg1 + arg2;

# 调用sum函数
print "相加后的值为 : ", sum( 10, 20 )
print "相加后的值为 : ", sum( 20, 20 )

变量作用域

一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:

  • 全局变量
  • 局部变量

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中

Python3.5入门学习记录-函数的更多相关文章

  1. Python3.5 入门学习记录——变量类型

    前面介绍了如何下载和安装Python3.5的环境,安装好了后开始进行练习,仍然是最基础的使用Python解释器进行Coding,由于我也是初学Python,也是根据网上其他的教程一点一点练习,然后归纳 ...

  2. Python3.5入门学习记录-File

    在Python中,操作文件对象使用open函数来创建,下表列出了常用的操作file的函数: 序号 方法及描述 1.file.close() 关闭文件.关闭后文件不能再进行读写操作. 2.file.fl ...

  3. Python3.5入门学习记录-模块

    模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了 ...

  4. Python3.5入门学习记录-列表、元组、字典

    1.列表 python列表的定义使用[] list = [1,2,3,4,5] #创建一个心列表list 获取列表中的值 first = list[0] #list中第一个值 last = list[ ...

  5. Python3.5入门学习记录-条件控制

    Python的条件控制同C#一样,都是通过一条或多条语句的执行结果(True OR False)来决定执行的代码块. if 语句 Python中if语句的一般形式如下所示: if condition_ ...

  6. redis入门学习记录(二)

    继第一节 redis入门学习记录(一)之后,我们来学习redis的基本使用. 接下来我们看看/usr/local/redis/bin目录下的几个文件作用是什么? redis-benchmark:red ...

  7. python入门学习记录(win7+python3.6)

    1. pip freeze 可以查看安装的模块信息 2. 查看某个模块是否已经安装了 conda(pip) search <moduleName>.图一显示为未安装,图二显示为已经安装

  8. gulp入门学习教程(入门学习记录)

    前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...

  9. [2017.02.07] Lua入门学习记录

    #!/home/auss/Projects/Qt/annotated/lua -- 这是第一次系统学习Lua语言 --[[ 参考资料: 1. [Lua简明教程](http://coolshell.cn ...

随机推荐

  1. C# 操作NPOI导入导出

    //把T_Seats中的输入导出到Excel private void button3_Click(object sender, EventArgs e) { //1.读取 string sql = ...

  2. mysql grant all privileges on

    遇到了 SQLException: access denied for @'localhost' (using password: no) 解决办法 grant all privileges on * ...

  3. 512M内存机器如何用好Mysql

    购买阿里云512M内存ECS后,mysql有时候会自动关闭,停止运行 解决办法: a,优化mysql配置,因为自己安装的是mysql 5.6,而从5.6开始,mysql安装包中不再包含my-small ...

  4. phantomjs form提交

    phantomjs表单提交,其实就是对DOM就行操作(获取元素),在这里实现了动态传入各种参数 不说了 直接上代码 var page = require('webpage').create(), sy ...

  5. 论如何进CSDN博客排名前500

    http://www.jtahstu.com/blog/post-71.html 目前该方法并不适用于博客园,显然写博客园的程序员智商要高些.

  6. Xcode把应用程序打包成ipa

    Xcode把应用程序打包成ipa 分类: App Store2012-11-20 15:47 11722人阅读 评论(0) 收藏 举报 Xcode教程 Xcode4发布测试 打包Archive操作是本 ...

  7. 开心菜鸟系列学习笔记------javascript(5)

    一.this的关系    1)全局代码中的this    2)函数代码中的this在函数代码中使用this时很有趣,这种情况很难且会导致很多问题. 这种类型的代码中,this值的首要特点(或许是最主要 ...

  8. BZOJ 1070 修车(最小费用流)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1070 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术 ...

  9. Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL

    我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...

  10. Android导航菜单横向左右滑动并和下方的控件实现联动

    这个是美团网个人订单的效果,找了很多地方都没找到,自己研究了两天终于弄出来了^_^,有什么问题希望大家指出来,谢谢. 实现原理是上方使用HorizontalScrollView这个可以水平横向拖动的控 ...