1.函数基本语法和特性
函数是指将一组语句的集合通过一个名字(函数名)封装起来,要执行函数,只要调用函数名。
特性:
1)减少重复代码
2)使程序变的可扩展
3)使程序变得易维护
# -*- coding:utf-8 -*- __author__ = 'shisanjun' def sayhi(): #函数名 print("hello,im nobody") sayhi() #调用函数 def calc(x,y): #可以带参数,形参 res=x*y return res print(calc(2,3))#实参
2. 函数参数与局部变量
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。
因此形参只在函数内部有效。函数调用结束返回主调用函数后则不能使用该形参变量。
实参可以是常量,变量,表达式,函数等,无论实参是何种类型的量,在进行函数调用时它们
都必须有确定的值,以便把这些值传给形参。所以应预先赋值,
输入等办法使参数获得确定的值。
3. 默认参数
参数在不指定时,就用默认值。
def calc(x,y=4): #可以带参数,y有默认值 res=x*y return res print(calc(2))
4. 关键参数
正常情况下,给函数传参数是要按顺序,不想按顺序可以关键参数,只需要指定参
数名即可。关键参数必须放在位置参数之后。
5. 非固定参数
在不确定用户想传入多少个参数,就可以使用非固定参数
*args 把多个传入的位置参数变成一个元组
**kwargs把多个传入的关键参数变成一个字典。
def stu_register(name,age,*args): #*args 会把多传入的参数变成一个元组
print(name,age,args)
stu_register("Alex",22) #后面这个()就是args,只是没有传值,所以为空
stu_register("Jack",32,"cn","python")
def stu_register1(name,age,*args,**kwargs): #**kwargs 会把多传入的关键参数变成字典
print(name,age,args,kwargs)
stu_register1("Alex",22)
stu_register1("Jack",32,"CN","Python",sex="male")
6. 局部变量与全局变量
在子程序中定义的变量为局部变量,在程序的一开始定义的变量称为全局变量。
在全局变量作用或是整个程序,局部变量作用或是定义该变量的子程序
当全局变量与局部变量同名时;子程序内局部变量起作用,在其他地方全局变量起作用。
修改全局变量使用global;如果变量为列表,字典等,在局部变量可以修改
# -*- coding:utf-8 -*- __author__ = 'shisanjun' name="alex" #全局变量 def change_name(name): print("befoce change",name) name="shisan" #局部变量 print("after change",name) print(name) change_name(name) print(name) def change_name(name): print("befoce change",name) global name1 #修改全局变量,不建议使用 name1="shisan" #局部变量 print("after change",name) name1="alex" print(name1) change_name(name1) print(name1)
7. 返回值
要想获得函数执行的结果,就可以用return语句把结果返回
注:1)函数在执行过程中只要遇到return语句,就会停止执行并返回结果。
2)如果未在函数中指定return,这个函数的返回值为None
8. 函数可以嵌套函数。
9. 递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身,这人函数就是递归函数。
递归特性:
1)必须有一个明确的结束条件
2)每次进入更深一层递归时,问题规模比上次递归都相应减少
3)递归效率不高,递归层次过多会导致栈溢出。
注:递归最大999次
10. 匿名函数
匿名函数就是不需要显式的指定函数。
# -*- coding:utf-8 -*- __author__ = 'shisanjun' def calc(n): print(n) if int(n/2)==0: return n return calc(int(n/2)) calc(10) def calc1(n): return n**n print(calc1(10)) calc2=lambda n:n**n #换成匿名函数 print(calc2(10))
11.函数式编程
python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。主要思想是把运算过程尽量写成一系列嵌套的函数调用
12. 高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
13. 内置函数
# -*- coding:utf-8 -*- __author__ = 'shisanjun' #https://docs.python.org/3/library/functions.html?highlight=built#ascii #返回一个数的绝对值。参数可能是整数或浮点数。如果参数是一个复数,返回它的大小 print(abs(9)) print((abs(-9))) print(abs(9.11)) #返回 True如果所有的元素iterable真(或者如果iterable为空,即有0就为False print(all([1,2,3])) print(all((x for x in range(3)))) #False print(all([x for x in range(1,3)]))#TRUE #返回 True如果任何元素的iterable是正确的。如果iterable为空,返回 False print(any([1,2,3])) print(any((x for x in range(3)))) print(any([x for x in range(3)])) #返回个字符串 print(ascii('abcdef')) #将一个整数转换成一个二进制字符串 print(bin(100)) #返回一个布尔值,即之一 True或 False print(bool(1)) print(bool(0)) """ bytearray() 这个个可变的序列 返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。 可以通过“字节与字节数组操作”章节来查看相关字节数组的内容。下面说明一下几种特别的使用方法: 1. 如果source是一个字符串,那么必须给出endcoding是什么样编码的,以便转换为合适的字节保存。 2. 如果source是一个整数,那么这个数组将初始化为空字节。 3. 如果source是一个有缓冲区接口的对象,那么只读的接口初始到数组里。 4. 如果source是一个迭代对象,那么这个迭代对象的元素都必须符合0 <= x < 256,以便可以初始化到数组里。 """ print(bytearray("aaaa中国333",encoding="utf-8")) #bytearray(b'aaaaxe4xb8xadxe5x9bxbd333') print(bytearray(10)) #bytearray(b'x00x00x00x00x00x00x00x00x00x00') print(bytearray([1,2,3])) #bytearray(b'x01x02x03') #返回一个新的“bytes”对象,这是一个不可变的整数序列 print(bytes("aa",encoding="utf-8")) #b'aa' #是否可调用 #callable() #返回表示Unicode代码点为整数i的字符的字符串 print(chr(97)) """ compile(source, filename, mode[, flags[, dont_inherit]]) 中文说明:将source编译为代码或者AST对象。代码对象能够通过exec语句来执行或者eval()进行求值。 参数source:字符串或者AST(Abstract Syntax Trees)对象。 参数 filename:代码文件名称,如果不是从文件读取代码则传递一些可辨认的值。 参数model:指定编译代码的种类。可以指定为 ‘exec’,’eval’,’single’。 参数flag和dont_inherit:这两个参数暂不介绍,可选参数。 """ code="for i in range(10):print(i)" cmpcode=compile(code,'','exec') exec(cmpcode) str="3*4+5" a = compile(str,'','eval') eval(a) #创建一个新的字典 d=dict() #d={} #dir() #返回该对象的有效属性列表 #divmod(5,2)#回一个由他们的商和余数组成的数字 #enumerate([1,2,3])#返回枚举对象 #eval()#将字符串str当成有效的表达式来求值并返回计算结果。 #exec()#exec语句用来执行储存在字符串或文件中的Python语句 """ filter(function, sequence):对sequence中的item依次执行function(item), 将执行结果为True的item组成一个List/String/Tuple 取决于sequence的类型)返回 """ def f(x):return x%2 !=0 and x%3!=0 for i in filter(f,range(2,25)): print(i) """ map(function, sequence) : 对sequence中的item依次执行function(item), 见执行结果组成一个List返回 """ def f(x):return x*x for i in map(f,range(2,25)): print(i) """ format(value [,format_spec ] ) 将值转换为由format_spec控制的“格式化” """ print(hash("aaaa")) #返回对象的哈希值 hex()#将整数转换为以“0x”为前缀的小写十六进制字符串 oct()#将整数转换为八进制字符串 input()#如果提示参数存在,则将其写入标准输出,而不带尾随的换行符。该函数然后从输入读取一行,将其转换为字符串(剥离尾随的换行符),并返回 int()#转换成整数 isinstance() #是不是实例 issubclass()#是不是子类 iter()#转成生成器 locals()#反回局部变量 len()#返回长度 max()#反回最大值 min()#返回最小值 ord('c')#给定一个表示一个Unicode字符的字符串,返回一个整数 pow(x,y)#将x返回到幂y #range(开始,停止[,步骤] ) #repr(对象)返回一个包含对象的可打印表示的字符串 #reversed(seq )返回一个反向迭代器 #round(number [,ndigits ] )在小数点后,返回数字四舍五入到ndigits精度 #sorted(iterable [,key] [,reverse] )从iterable中的项中返回一个新的排序列表 #sum()求和 #type(名称,基地,字典)使用一个参数,返回一个对象的类型 #zip(* iterables )做一个迭代器来聚合每个迭代的元素。