Python 函数定义以及参数传递
①函数定义
#形如def func(args...):
以关键字def 开头,后面是函数名和参数下面是函数处理过程.
举例:
def add( a, b ):
参数可以设定默认值,如:
def add( a, b=10 ): #注意:默认值参数只会运算一次
默认值参数只会运算一次是什么意思?
def func( a, b=[] ): #b的默认值指向一个空的列表,每次不带默认值都会指向这块内存
b.append(a) return b
结果:
[1]
这下明白为什么默认参数只计算一次了吧,函数参数不传递时默认值总是指向固定的内存空间,就是第一次计算的空间.
def func(a, b):
在使用函数时可以如下方式,结果都是相同的
如果函数定义形式如下方式:
def func(*args): #这种定义会把传递的参数包成元组
print(args,type(args))
举一个和上述过程相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
总结:*号在定义函数参数时,传入函数的参数会转换成元组,如果 *号在调用时则会把元组解包成单个元素.
另一种定义:
def func(**kw):#使用**定义参数会把传入参数包装成字典dict
print(kw, type(kw) )
相反的例子:
def func(*args, **kw):#这种形式的定义代表可以接受任意类型的参数
总结:**号在定义函数参数时,传入函数的参数会转换成字典,如果 **号在调用时则会把字典解包成单个元素.
lambda表达式
lambda表达式就是一种简单的函数
例如:
add = lambda x,y: x+y
在前面已经多次提到函数这个概念,之所以没有解释什么是函数,是因为程序中的函数和数学中的函数差不多,如input()、range()等都是函数,这些都是Python的标准函数,直接使用就可以了.根据需要,用户也可以自定义函数.
函数的结构:
def 函数名(参数):
函数体
return 返回值
def f(x):
return(y)
下面给出完整的程序代码:
print(res)
运行结果:11
上例中的y是函数f(x)的返回值.并不是所有的函数都有参数和返回值.如下面的函数:
def func():
print('此为无参数传递、无返回值的函数')
func()
输出结果:此为无参数传递、无返回值的函数
可以看出,该函数func()无参数,故调用时不用赋给参数值.
def f(x,y):
return z
也可以通过直接给参数列表中的参数赋值的方法,为参数添加默认值,如果用户赋予参数值,则按照用户赋值执行,否则使用默认值.例如:
回调函数,又称函数回调,是将函数作为另一函数的参数.
def func(fun,m,n):
fun(m,n)
def f_add(m,n):
print('m+n=',m+n)
def f_mult(m,n):
print('m*n=',m*n)
输出结果:
在f_add(m,n)和f_mult(m,n)被定义前,func(fun,m,n)中的fun(m,n)就已经调用了这两个函数,即"先调用后定义",这也是回调函数的特点.
如果无法预知参数的个数,可以在参数前面加上*号,这种参数实际上对应元组类型.譬如,参会的人数事先不能确定,只能根据与会人员名单输入:
def func(*names):
print('今天与会人员有:')
for name in names:
print(name)
func('张小兵','陈晓梅','李大海','王长江')
运行后,输出结果为:
今天与会人员有:
张小兵
陈晓梅
李大海
王长江
参数为字典类型,需要在参数前面加上**号.
def func(**kwargs):
for i in kwargs:
print(i,kwargs[i])
func(a='a1',b='b1',c='c1')
输出结果为:
a a1
b b1
c c1
一个有趣的实例:
def func(x,y,z,*args,**kwargs):
print(x,y,z)
print(args)
print(kwargs)
func('a','b','c','Python','is easy',py='python',j='java',ph='php')
a b c # 前三个实参赋给前三个形参
('Python', 'is easy') # *args接收元组数据
{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典数据
变量的作用域即变量的有效范围,可分为全局变量和局部变量.
局部变量
在函数中定义的变量就是局部变量,局部变量的作用域仅限于函数内部使用.
全局变量
在主程序中定义的变量就是全局变量,但在函数中用关键字global修饰的变量也可以当做全局变量来使用.
全局变量的作用域是整个程序,也就是说,全局变量可以在整个程序中可以访问.
下面通过实例去讨论:
程序1:
a=1 # a为全局变量
def a_add():
print('a的初值:',a) # 在函数中读取a的值
a_add() # 调用函数a_add()
a+=1 # 主程序语句,a增加1
print('a现在的值是:',a) # 主程序语句,读取a的值
运行结果:
a的初值: 1
这个结果和我们想象的一样,全局变量a既可以在主程序中读取,也可以在子程序(函数)中读取.
a=1
a+=1
print('a的初值:',a)
a_add()
print('a现在的值是:',a)
运行程序1时出现如下错误提示:
UnboundLocalError: local variable 'a' referenced before assignment
意思是:局部变量'a'在赋值之前被引用.
怎样解决这个问题?
def a_add(x):
x+=1
return x
a=a_add(a)
结果的确是正确的,但在函数a_add(x)中没有调用变量a(没有出现变量a).
def a_add(a):
return a
global a
虽然使用global可使变量使用起来非常方便,但也容易引起混淆,故在使用过程中还是谨慎为好.
递归,就是函数调用它自身.递归必须设置停止条件,否则函数将无法终止,形成死循环.
以计算阶乘为例:
def func(n):
if n==1:
return 1
else:
return n*func(n-1) #func( )调用func( )
嵌套,指在函数中调用另外的函数.这是程序中常见的一种结构,在此不再赘述.
匿名函数
Python中可以在参数前加上关键字lambda定义一个匿名函数,这样的函数一般都属于"一次性"的.
程序1:这是一个常规的函数定义和调用.
def f_add(x,y):
return x+y
f_add=lambda x,y:x+y
①.、函数定义
①使用def关键字定义函数
②
"""文档字符串,docstring,用来说明函数的作用"""
#函数体
return 表达式
注释的作用:说明函数是做什么的,函数有什么功能.
③遇到冒号要缩进,冒号后面所有的缩进的代码块构成了函数体,描述了函数是做什么的,即函数的功能是什么.Python函数的本质与数学中的函数的本质是一致的.
①函数必须先定义,才能调用,否则会报错.
③不要在定义函数的时候在函数体里面调用本身,否则会出不来,陷入循环调用.
④函数需要调用函数体才会被执行,单纯的只是定义函数是不会被执行的.
⑤Debug工具中Step into进入到调用的函数里,Step Into My Code进入到调用的模块里函数.
运算
b = 10
c = 0
c = a + b
print "1 - c 的值为:", c
c = a - b
c = a * b
c = a / b
c = a % b
c = a**b
a = 10
c = a//b
python比较
if ( a == b ):
print "1 - a 等于 b"
print "1 - a 不等于 b"
if ( a != b ):
if ( a b ):
if ( a = b ):
if ( b = a ):
赋值
c += a
c *= a
c /= a
c %= a
c **= a
c //= a
逻辑运算符:
if ( a and b ):
print "1 - 变量 a 和 b 都为 true"
print "1 - 变量 a 和 b 有一个不为 true"
if ( a or b ):
a = 0
if not( a and b ):
in,not in
if ( a in list ):
print "1 - 变量 a 在给定的列表中 list 中"
print "1 - 变量 a 不在给定的列表中 list 中"
if ( b not in list ):
条件
flag = False
name = 'luren'
if name == 'python': # 判断变量否为'python'
flag = True # 条件成立时设置标志为真
print 'welcome boss' # 并输出欢迎信息
print name
print 'boss'
print 'user'
elif num == 1:
print 'worker'
elif num 0: # 值小于零时输出
print 'error'
print 'roadman' # 条件均不成立时输出
循环语句:
count = 0
print 'The count is:', count
count = count + 1
print "Good bye!"
i = 1
while i 10:
i += 1
continue
while 1: # 循环条件为1必定成立
print i # 输出1~10
if i 10: # 当i大于10时跳出循环
break
for letter in 'Python': # 第一个实例
print '当前字母 :', letter
fruits = ['banana', 'apple', 'mango']
for fruit in fruits: # 第二个实例
print '当前水果 :', fruit
获取用户输入:raw_input
var = 1
while var == 1 : # 该条件永远为true,循环将无限执行下去
num = raw_input("Enter a number :")
print "You entered: ", num
range,len
for index in range(len(fruits)):
print '当前水果 :', fruits[index]
python数学函数:
abs,cell,cmp,exp,fabs,floor,log,log10,max,min,mod,pow,round,sqrt
randrange
访问字符串的值
var1 = 'Hello World!'
print "var1[0]: ", var1[0]
转义字符
格式化输出
字符串函数:
添加元素
list = [] ## 空列表
list.append('Google') ## 使用 append() 添加元素
list.append('Runoob')
print list
删除元素
print list1
列表操作
列表方法
删除字典
del dict['Name']; # 删除键是'Name'的条目
dict.clear(); # 清空词典所有条目
del dict ; # 删除词典
print "dict['Age']: ", dict['Age'];
print "dict['School']: ", dict['School'];
字典的函数:
当前时间戳:
import time
time.time()
格式化日期输出
print time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
print time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))
获取某个月日历:calendar
import calendar
print cal
当前日期和时间
import datetime
i = datetime.datetime.now()
print ("当前的日期和时间是 %s" % i)
print ("ISO格式的日期和时间是 %s" % i.isoformat() )
print ("当前的年份是 %s" %i.year)
print ("当前的月份是 %s" %i.month)
print ("当前的日期是 %s" %i.day)
print ("dd/mm/yyyy 格式是 %s/%s/%s" % (i.day, i.month, i.year) )
print ("当前小时是 %s" %i.hour)
print ("当前分钟是 %s" %i.minute)
print ("当前秒是 %s" %i.second)
不定长参数:*
lambda:匿名函数
def....
python模块搜索路径
获取用户输入
str = raw_input("请输入:")
print "你输入的内容是: ", str
input可以接收表达式
open参数
write要自己添加换行符
读取10个字符
重命名:os.rename
os.remove
os.mkdir os.chdir
os.getcwd
os.rmdir
file的方法
异常:
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
print "内容写入文件成功"
fh.close()
finally:
用户自定义异常:
os 模块提供了非常丰富的方法用来处理文件和目录.常用的方法如下表所示:
| 序号 | 方法及描述 |
| 1 |
os.access(path, mode)
检验权限模式 |
os.chdir(path)
改变当前工作目录 |
os.chflags(path, flags)
设置路径的标记为数字标记. |
os.chmod(path, mode)
更改权限 |
os.chown(path, uid, gid)
更改文件所有者 |
os.chroot(path)
改变当前进程的根目录 |
os.close(fd)
关闭文件描述符 fd |
os.closerange(fd_low, fd_high)
关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
os.dup(fd)
复制文件描述符 fd |
| 10 |
| 11 |
os.fchdir(fd)
通过文件描述符改变当前工作目录 |
os.fchmod(fd, mode)
改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限. |
os.fchown(fd, uid, gid)
修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定. |
os.fdatasync(fd)
强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息. |
os.fdopen(fd[, mode[, bufsize]])
通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
os.fpathconf(fd, name)
os.fstat(fd)
返回文件描述符fd的状态,像stat(). |
os.fstatvfs(fd)
返回包含文件描述符fd的文件的文件系统的信息,像 statvfs() |
os.fsync(fd)
强制将文件描述符为fd的文件写入硬盘. |
os.ftruncate(fd, length)
裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小. |
os.getcwd()
返回当前工作目录 |
os.getcwdu()
返回一个当前工作目录的Unicode对象 |
os.isatty(fd)
如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False. |
os.lchflags(path, flags)
设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
os.lchmod(path, mode)
修改连接文件权限 |
os.lchown(path, uid, gid)
更改文件所有者,类似 chown,但是不追踪链接. |
os.link(src, dst)
创建硬链接,名为参数 dst,指向参数 src |
os.listdir(path)
返回path指定的文件夹包含的文件或文件夹的名字的列表. |
os.lseek(fd, pos, how)
os.lstat(path)
像stat(),但是没有软链接 |
os.major(device)
从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field). |
os.makedev(major, minor)
以major和minor设备号组成一个原始设备号 |
os.makedirs(path[, mode])
递归文件夹创建函数.像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹. |
os.minor(device)
从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field ). |
os.mkdir(path[, mode])
os.mkfifo(path[, mode])
创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe).
|
os.open(file, flags[, mode])
打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
os.openpty()
打开一个新的伪终端对.返回 pty 和 tty的文件描述符. |
os.pathconf(path, name)
返回相关文件的系统配置信息. |
os.pipe()
创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
os.popen(command[, mode[, bufsize]])
从一个 command 打开一个管道 |
os.read(fd, n)
从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串. |
os.readlink(path)
返回软链接所指向的文件 |
os.remove(path)
删除路径为path的文件.如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory. |
os.removedirs(path)
递归删除目录. |
os.rename(src, dst)
重命名文件或目录,从 src 到 dst |
os.renames(old, new)
递归地对目录进行更名,也可以对文件进行更名. |
os.rmdir(path)
删除path指定的空目录,如果目录非空,则抛出一个OSError异常. |
os.stat(path)
获取path指定的路径的信息,功能等同于C API中的stat()系统调用. |
os.stat_float_times([newvalue])
决定stat_result是否以float对象显示时间戳
os.statvfs(path)
获取指定路径的文件系统统计信息 |
os.symlink(src, dst)
创建一个软链接 |
os.tcgetpgrp(fd)
返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
os.tcsetpgrp(fd, pg)
设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg. |
os.tempnam([dir[, prefix]])
返回唯一的路径名用于创建临时文件. |
os.tmpfile()
返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除. |
os.tmpnam()
为创建一个临时文件返回一个唯一的路径 |
os.ttyname(fd)
返回一个字符串,它表示与文件描述符fd 关联的终端设备.如果fd 没有与终端设备关联,则引发一个异常. |
os.unlink(path)
删除文件路径 |
os.utime(path, times)
返回指定的path文件的访问和修改的时间. |
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
输出在文件夹中的文件名通过在树中游走,向上或者向下. |
os.write(fd, str)
写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
python中定义函数的关键字是def.
Python使用def关键字开始函数定义,紧接着是函数名,括号内部为函数的参数,内部为函数的具体功能实现代码,如果想要函数有返回值, 在expressions中的逻辑代码中用return返回.
上面我们定义了一个名字为 function 的函数,函数没有不接受参数,所以括号内部为空,紧接着就是 函数的功能代码.
如果执行该脚本,发现并没有输出任何输出,因为我们只定义了函数,而并没有执行函数. 这时我们在Python命令提示符中输入函数调用 function(), 注意这里调用函数的括号不能省略.
python的学习
如果我们用代码实现了一个小功能,但想要在程序代码中重复使用,不能在代码中到处粘贴这些代码,因为这样做违反了软件工程中DRY原则. Python提供了函数功能,可以将我们这部分功能抽象成一个函数以方便程序调用,或者提供给其他模块使用.
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.(推荐学习:Python视频教程)函数必须先定义,才能调用,否则会报错,无参数时函数的调用函数名().
有参数时函数的调,不要在定义函数的时候在函数体里面调用本身,否则会出不来,陷入循环调用,函数需要调用函数体才会被执行,单纯的只是定义函数是不会被执行的.
浮点数的数学运算函数.根据调查相关资料得知,Python中math.gbs模块提供了许多对浮点数的数学运算函数.主要包括以下几个部分:数论与表示函数、幂函数与对数函数、三角函数角度转换和双曲函数.
以上就是土嘎嘎小编为大家整理的pythons数学函数相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!