python基础-函数

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 )做一个迭代器来聚合每个迭代的元素。
原文地址:https://www.cnblogs.com/lixiang1013/p/6742137.html