一、函数

1. 简介

  函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率

2. 组成

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

示例:

1 def functionname( parameters ):
2 "函数声明、注释等内容,一般为__doc__部分"
3 函数主体部分
4 return [expression]

3. 简单调用

  以上边的示例为例,调用方法很简单执行如下代码。

functionname(参数)

  注意,函数定义好之后,并不会运行。只有在调用的时候会运行。

二、函数各组成部分

2.1 函数的命名

  函数名应该为小写,可以用下划线风格单词以增加可读性。如:myfunction,my_example_function。

Python之父Guido推荐的命名规范包括如下几点:
模块名和包名采用小写字母并且以下划线分隔单词的形式;
类名采用以大写字母开头,并且以大写字母分隔单词的形式命名;
全局或者类常量,全部使用大写字母,并且以下划线分隔单词;其余变量命名则是采用全部小写字母,并且以下划线分隔单词的形式命名。
以上的内容如果是内部的,则使用下划线开头命名。

2.2 函数参数

  函数的参数分为四类:普通参数、默认参数、指定参数、可变参数

2.2.1 普通参数

1 def functionname(name,age):
2 print("I'm %s, age %s" % (name, age))
3
4 functionname("yaoming",18)
5 out: I'm yaoming, age 18

2.2.2 默认参数

1 def functionname(name,age=18):
2 print("I'm %s, age %s" % (name, age))
3
4 functionname("yaoming")
5 out: I'm yaoming, age 18

2.2.3 指定参数

1 def functionname(name,age=18):        
2 print("I'm %s, age %s" % (name, age))
3
4 functionname(age=32, name="yaoming")    #上述默认age参数为18,如果这里不指定age的话,默认会使用18,但是如果我们指定参数的话,优先会执行我们指定的参数值。
5 out: I'm yaoming, age 32

2.2.4 可变参数

2.2.4.1 可变参数*

1 def function_name(*args):
2 print(args, type(args))
3
4 function_name(1,2,3)
5 out: (1, 2, 3) <class 'tuple'>
6
7 function_name((1,2,3))
8 out: ((1, 2, 3),) <class 'tuple'>

  由上边的例子可以看出,默认将传入的参数,全部放在元组中,即args = (...),在执行()的时候,会进行tuple.__init__方法。

1 def function_name(*args):
2 print(args, type(args))
3 function_name(*(1,2,3))
4
5 out: (1, 2, 3) <class 'tuple'>
6
7 function_name(*'wzg')
8 function_name(*['jack','tony'])
9 out: ('w', 'z', 'g') <class 'tuple'>
10 out: ('jack', 'tony') <class 'tuple'>
 

  从上边的例子,可以看出带*的参数,会循环变量中的每个元素加入至tuple中。字符串的话循环每个字母。如果传入的是个列表或者元组,返回的是列表,元组中的每个元素。class类型都是作为'tuple'返回。

def function_name(*args):
#print(args,type(args)) for name in args:
print(name,type(name)) function_name('liupeng','jack',11,22,['a','b','c'])
out: 
liupeng <class 'str'>
jack <class 'str'>
11 <class 'int'>
22 <class 'int'>
['a', 'b', 'c'] <class 'list'>

  还是基于*args案例的基础上添加了for循环语句,循环的是args中的每个元素并显示元素的类型。从上例可以看出*接收的不光可以是一个字符串,还可以是数字或者列表。

2.2.4.2 可变参数**


def function_name(**args):
print(args,type(args)) function_name(name = 'wzg',job = "IT")

out: {'name': 'wzg', 'job': 'IT'} <class 'dict'>

-----------------------------------------------------------
dic = {'k1':'v1','k2':'v2'}
function_name(**dic)
out: {'k2': 'v2', 'k1': 'v1'} <class 'dict'>
-----------------------------------------------------------
function_name(di = dic)
out: {'di': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'>

  从上边的例子可以看出,可变参数** , 默认将参数的参数,全部放在字典中进行处理。

  具体分析下上例:

  1.函数本身不用多说,当我们在第一次调用函数时因为参数我们指定了(name跟job的)参数因此打印时候直接输出了字典keys为name跟job,values为wzg,IT即 {'name': 'wzg', 'job': 'IT'} <class 'dict'>。

  2.在第二次调用函数时,会发现我们这次调用函数()中传的参数也是**的方式。这里提前创建了一个dic的字典并把它作为函数的参数使用。结合**的用法,使得字典中每个元素作为参数传到函数中被调用。

即{'k2': 'v2', 'k1': 'v1'} <class 'dict'>。

  3.最后一次调用函数时,我们参数是这么指定的(di = dic),这里可以看出跟1的使用方法相同。对了,没错。这次只不过是我们把整个dic作为了字典中的values来传入函数了而di做为了字典中的key。即

   {'di': {'k2': 'v2', 'k1': 'v1'}} <class 'dict'>

总结:上面1-3不管那一种的类型最终都是<class 'dict'>也就是说**args,或者**其他什么变量最终生成的结果都是以字典的方式呈现。而*args最终都是以元组的方式呈现。

2.3 函数注释

  Python有一种独一无二的的注释方式: 使用文档字符串. 文档字符串是包, 模块, 类或函数里的第一个语句. 这些字符串可以通过对象的__doc__成员被自动提取, 并且被pydoc所用。参照下面的一个代码

def function_name(big_table, keys, other_silly_variable=None):
"""Fetches rows from a Bigtable. Retrieves rows pertaining to the given keys from the Table instance
represented by big_table. Silly things may happen if
other_silly_variable is not None. Args:
big_table: An open Bigtable Table instance.
keys: A sequence of strings representing the key of each table row
to fetch.
other_silly_variable: Another optional variable, that has a much
longer name than the other args, and which does nothing. Returns:
A dict mapping keys to the corresponding table row data
fetched. Each row is represented as a tuple of strings. For
example: {'Serak': ('Rigel VII', 'Preparer'),
'Zim': ('Irk', 'Invader'),
'Lrrr': ('Omicron Persei 8', 'Emperor')} If a key from the keys argument is missing from the dictionary,
then that row was not found in the table. Raises:
IOError: An error occurred accessing the bigtable.Table object.
"""
function_body
return [expression] 注释

注释:

  从例子中,可以看出函数注释包含以下几个部分:

  1.整体功能说明  2.输入参数说明  3.输出/返回值说明  4.异常说明  5.其他

2.4 函数主体

  函数主体部分就是代码逻辑的实现/处理过程。

2.5 函数返回值

  函数返回值是一个可选的选项,可以返回一个表达式、某种数据结构等。默认返回None

三、函数的分类

  函数大概可以分为以下几类

  • 內建函数
  • 自定义函数
  • 匿名函数

3.1 內建函数 __builtins__

  从Python3.5官网拔下来一张最新的内置函数列表

  与2.7Python相比:

  新增:ascii() ,bytes() , exec(),
  减少:basestring() ,cmp(), execfile(), file(),long(),raw_input(),reduce(), reload() , unichr(), unicode() ,xrange()

3.2 常用內建函数

3.2 常用內建函数

函数名 作用
all(iterable) 1、集合中的元素都为真的时候为真  2、特别的,若为空串返回为True
any(iterable) 1、集合中的元素有一个为真的时候为真 2、特别的,若为空串返回为False
bool([x]) 将x转换为Boolean类型
ascii() 只要执行这个方法,则会自动调用对象的__repr__。这个函数跟repr()函数一样,返回一个可打印的对象字符串方式表示。当遇到非ASCII码时,就会输出\x,\u或\U等字符来表示。与Python 2版本里的repr()是等效的函数。
abs(x) 求绝对值
pow(x, y[, z])  返回x的y次幂
oct(x) 将一个数字转化为8进制
hex(x) 将整数x转换为16进制字符串
bin(x) 将整数x转换为二进制字符串
bytes("要转化的字符串", encoding="编码") 字符串转换为字节类型

具体详细使用方法请参照:https://docs.python.org/3/library/functions.html#reversed

or http://www.cnblogs.com/phennry/p/5544509.html (英文不好的同学推荐)

3.3 自定义函数

  我们平时使用的大多数函数,以及开发中创建的函数,都属于自定义函数。这极大的提高了代码的重用性和可读性。

自定义函数的创建和使用,在上文中已经进行了说明和示例,参照上边文章即可。这里不作过多说明。

3.4 匿名函数

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

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

3.4.1 匿名函数创建语法

    lambda [arg1 [,arg2,.....argn]]:expression

3.4.2 示例

>>> lambda x: x+1 #一个参数
>>> lambda x,y,z:x+y+z #多个参数

>>> lambda x,y=3: x*y #允许参数存在默认值,但是默认值的参数必须参数顺序最后

e = lambda x,y = 3: x*y
print(e(4)) out:
12 a = lambda x,y=2: x*y
print(a(4,5)) out:
20 b = lambda x,y,z: x*y*z
print(b(3,5,2)) out:
30

lambda表达式

lambda表达式函数表达

通过下例可以看出普通方式跟lambda表达式的方便之处直接通过lambda表达式就能返回值。

#定义函数  (普通方式)

def name(arg):
return arg + 1 #执行函数 print(name(23)) out:
24 #定义函数 (lambda表达式) my_lambda= lambda arg: arg +1 #执行函数 result = my_lambda(23) print(result) out:
24

四、作用域

  python中的作用域分4种情况:

  L:local,局部作用域,即函数中定义的变量;
  E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的;
  G:global,全局变量,就是模块级别定义的变量;

  B:built-in,系统固定模块里面的变量,比如int, bytearray等。

搜索变量的优先级顺序依次是:作用域局部>外层作用域>当前模块中的全局>python内置作用域,也就是LEGB。

补充:

函数局部变量和全局变量:
在局部中调用全局变量(读取全局变量默认不用写。修改时需要),当全局变量为列表和字典,局部引用区域引用时不使用global时也是可以修改,不能重新赋值。全局变量与局部变量名称冲突时,在函数体内部优先使用局部变量

>>> li=[11,22,33]
>>> def name(li):
li=li.append(44) #全局变量在函数体内由于是引用,所以可以别修改,但是不能被赋值
>>> name(li)
>>> print(li)
[11, 22, 33, 44] >>> li=[11,22,33]
>>> def name(li):
li='hello' #函数体内对全局变量赋值,结果没有改变
>>> name(li)
>>> print(li)
[11, 22, 33, 44] >>> li=[11,22,33]
>>> def name(arg):
global li #使用global,可以对全局变量进行修改,不建议使用
li='hello world'
>>> name(li)
>>> print(li)
hello world

五、文件操作

操作文件,一般需要经过三大步骤

  1. 打开文件

  2. 操作文件

  3. 关闭文件(非必须)

3.1 打开文件

  打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。通常我们使用open()函数来打开文件,源码中说明了打开模式:

open函数3.5.1源码
模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。这种方法基本不用
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

x
如果文件存在则报错,如果不存在,则创建文件并写内容

3.2 操作文件

  创建文件句柄之后,可以针对句柄对文件进行如下操纵

python3.5.1源码

3.3 关闭文件

  这步操作并不是必须的,如果使用open()函数打开文件,那么要记得最终close()文件

如果使用with 语句打开的文件,则不需要。在with 语句主体语句执行完之后,会自动调用close()来关闭文件句柄。语法如下:

1 with open('db1', 'r', encoding="utf-8") as f1:
2 for line in f1:
3 print(line)

同时打开2个文件,语法如下:

1 with open('file1', 'r', encoding="utf-8") as f1, open("file2", 'w',encoding="utf-8") as f2:
2 pass

本章总结至此结束!

此文转载于http://www.cnblogs.com/jishuweiwang/p/5528905.html

转载此文对于函数的总结个人感觉已经非常细致,因此没有自己撰写,直接转载并对其内容做了测试并添加了部分自己的案例。

“今天的努力都是明天别人对你的膜拜,今天的停滞就是明天别人对你的唾弃!“

【Python】函数基础简介的更多相关文章

  1. 《转》Python学习(17)-python函数基础部分

    http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...

  2. Python 函数基础、有序集合、文件操作(三)

    一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...

  3. python函数基础学习

    函数的定义与调用: def 函数名(参数1,参数2): ‘’’函数注释’’’ print(‘函数体’) return 返回值 定  义:def关键字开关,空格之后接函数名和圆括号,最后冒号结尾 def ...

  4. 10分钟学会Python函数基础知识

    看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运 ...

  5. Python函数基础和函数参数

    函数的定义和函数的调用 return的作用 三种参数的定义 常用的内置函数 len() 函数基础 函数的定义 def 函数名(参数): pass return 表达式 pass在这里表示什么都没有,不 ...

  6. python函数基础算法简介

    一.多层语法糖本质 """ 语法糖会将紧挨着的被装饰对象名字当参数自动传入装饰器函数中""" def outter(func_name): ...

  7. python函数基础

    一.基础 函数的定义 def 函数名(参数): ... 函数体 ... 返回值 #如果函数执行完毕也没有return语句时,自动return None. 空函数 如果想定义一个什么事也不做的空函数,可 ...

  8. python 函数基础介绍

    函数是对程序逻辑进行结构化或过程化的一种编程方法.能将整块代码巧妙地隔离成易于管理的小块,把重复代码放在函数中而不是进行大量的拷贝. 一.函数创建 def 函数创建格式如下: def function ...

  9. 4.python函数基础

    一.函数 1.函数简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但 ...

随机推荐

  1. mysql数据库的一些基本操作

    下面列出一些做项目时常用到的一些mysql操作. 1.对数据库的操作 查看所有的数据库:show databases; 新建一个数据库:create database database_name; 此 ...

  2. Git——2

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  3. IIS7.0上传文件限制的解决方法

    在 Windows7(iis7.5).Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击. ...

  4. mvc4 发布,遇到 403.14 问题,并且iis提示打开目录浏览。。。解决办法

    经测试,只需要在web.config的system.web的同级节点,添加如下代码,即可完美运行.原理参考文章:一.<validation validateIntegratedModeConfi ...

  5. 关于一次oracle sqlplus可登陆,但监听起不来的解决。由于listener.log文件超过4G

    1.在oracle服务器上cmd 执行 lsnrctl 执行start 过了好久,提示监听程序已经启动. 再执行status 过来好久,才提示命令执行成功. 最后找到原因是因为C:\Oracle\di ...

  6. MySQL Workbench “Error Code: 1175” 的解决方法

    转自:http://www.linuxidc.com/Linux/2012-04/59333.htm 当用MySQL Workbench进行数据库的批量更新时,执行一个语句会碰到以下错误提示: Err ...

  7. MonkeyRunner测试一MonkeyRunner的使用

    最近搭建MonkeyRunner开发环境,安装PyDev时,饱受折磨,现在终于搞定.因为一些原因,用了JDK1.6,在线安装插件PyDev成功后,Windows-Preferences里找不到PyDe ...

  8. Cordova 打包 Android release app 过程详解

    Cordova 打包 Android release app 过程详解 时间 -- :: SegmentFault 原文 https://segmentfault.com/a/119000000517 ...

  9. nginx相关的一些记录

    http redirect to https: if ($http_cf_visitor ~ '"scheme":"http"'){ rewrite ^/(.* ...

  10. EntityFramwork入门

    原blog https://msdn.microsoft.com/zh-cn/data/ee712907 本人测试环境:VS2015+SQL Server 2008 R2 遇到问题 使用SQL Man ...