函数

函数的定义

函数是指将一组语句的集合通过一个名字(函数名)封装起来,想要执行这段函数,通名函数名来进行调用

特性:

1.减少代码的重复性
2.程序的扩展性
3.对程序的可维护性

语法的定义:

def 函数名()
    代码块
函数名()

函数参数

形参

只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量,形参只是形式上的值

实参

实参是指实际产生的值,可以是常量、变量、表达式、函数等

def fun(x,y):# 这里的参数就是形参
    res = x+y
    return res
a = fun(1,2)# 传进来的参数是指实参
print(a)

默认参数

默认参数是指在定义形参的时候,把定义好的值以=赋值给形参,在调用的时候可以不指定参数,默认使用这个值,默认参数必须放到位置函数后面

def fun(name,age,det='IT'):
    print("""
        name:   %s
        age:    %s
        det:    %s
    """%(name,age,det))
fun('abc',22)
#输出结果:
#        name:   abc
#        age:    22
#        det:    IT
#不指定参数默认以定义好的形参来进行调用

关键函数

关键函数是指指定了参数名的函数就叫关键函数,不需要按照顺序传值,但是关键函数必须要在位置参数后面

def fun(name,age,det='IT'):
    print("""
        name:   %s
        age:    %s
        det:    %s
    """%(name,age,det))
fun(age=22,name='ab')
#输出结果:
#        name:   ab
#        age:    22
#        det:    IT

非固定参数

需要传多个值可以使用非固定参数
*args:传入多个参数,多个参数会以元组方式打印

def fun(name,age,*args):
    print("""
        name:   %s
        age:    %s
        det:    %s
    """%(name,age,args))
fun('ab',22,'CN','Python','IT')
'''
输出结果:
        name:   ab
        age:    22
        det:    ('CN', 'Python', 'IT')
'''

**kwargs:会把多余的传入的参数变成一个dict方式,以关键字来进行传值

def fun(name,age,*args,**kwargs):
    print(name,age,args,kwargs)
fun('ab',22,'CN','Python',detp='IT',salary=1222)
'''
输出结果:
ab 22 ('CN', 'Python') {'detp': 'IT', 'salary': 1222}
'''

返回值

返回值是指函数外部的代码想要获取函数执行的结果,就可以使用return语句来把结果进行返回
注意点:
1.如在函数中遇到return语句就会停止并返回执行的结果,也就是遇到return语句就代表着函数代码的结束
2.如未指定return的值,默认会返回None

def fun(x,y):
    res = x*y
    if res > 5:
        return True
    else:
        return False

a = fun(3,5)
if a:
    print('这是大于五的数!')
else:
    print('这是小于五的数')
#输出结果:
#这是大于五的数!

全局与局部变量

局部变量:是指在函数内定义的变量,只在函数内部和效
全局变量:是指在程序一开始的位置定义的变量,在全局生效
全局变量作用域是整个程序,局部变量作用域是定义该变量的函数
当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用;在其它地方全局变量起作用

作用域

作用域即活动的范围

  • 全局范围:全局存活,全局有效
  • 局部范围:临时存活,局部有效
    在函数中修改全局变量可使用global来进行修改
name = 'ab'
def func():
    global name
    name = 'ac'
    print('里面的',name)
func()
print('外面的',name)
#结果:
#里面的 ac
#外面的 ac

嵌套函数

嵌套函数是指函数里面再放一个函数

name = 'ab'
def foo():
    name = 'ac'

    def foo1():
        name = 'ad'
        print('第三层',name)
    foo1()
    print('第二层',name)
foo()
print('最外层',name)
'''
第三层 ad
第二层 ac
最外层 ab
'''

匿名函数

匿名函数是指不指定函数名的函数,主要用于与其它函数来进行配合使用

def fucn(x,y):
    return x**y
a = fucn(2,3)
print(a)

#匿名函数
b = lambda x,y:x**y
print(b(2,3))
#搭配其它函数使用
a = map(lambda x:x*2[1,3,5,7])
for i in a:
    print(i)
#输出:2 6 10 14

高阶函数

高阶函数是指一个函数可以接收另一个函数作为参数,满足任一个条件即是高价函数

  • 接受一个或多个函数作为输入
  • return 返回另外一个函数
def add(x,y,f):
    return f(x)+f(y)

a = add( 3, -6,abs)
print(a)

递归

递归是指在函数内部调用自身

def fucn(x):
    v = int(x/2)
    print(v)
    if v > 0:
        fucn(v)
    print(x)
#输出:
'''
5
2
1
0
1
2
5
10
'''

递归特性:

  1. 必须有一个明确的结束条件
  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

递归的实际应用,二分查找

data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]

def binary_search(dataset,find_num):
    print(dataset)

    if len(dataset) > 1:
        mid = int(len(dataset) / 2) # 将列表一分二
        if dataset[mid] == find_num:  # find it
            print('找到数字',dataset[mid])
        elif dataset[mid] > find_num: # 找到的数在左面列表
            print("\033[31;1m数字在mid[%s]左面\033[0m"% dataset[mid])
            return binary_search(dataset[0:mid], find_num)
        else:
            print('\033[32;1m数字在mid[%s]右面\033[0m'%dataset[mid]) #找到的数在右面列表
            return binary_search(dataset[mid + 1:], find_num)
    else:
        if dataset[0] == find_num:
            print('成功找到数字',dataset[0])
        else:
            print("没的分了,要找的数字[%s]不在列表里"%find_num)

binary_search(data,55)

内置函数

内置函数解析

函数名 解析 例子
abs() 返回数字的绝对值 print "abs(-45) : ", abs(-45)
divmod() 把除数与余数运算结果结合起来,返回一个包含商和余数的元组(a//b,a%b) divmod(1+2j,1+0.5j)输出 ((1+0j), 1.5j)
staticmethod() 返回函数的静态方法
all() 用于判断给定的可迭代参数 iterable 中的所有元素是否不为 0、''、False 或者 iterable 为空,如果是都不为空返回 True,否则有一个为空返回 False
enumerate() 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
int() 强制转成一个整数
ord() 返回字符在ASCII中的数字 ord('a')返回 97
chr() 返回数字在ASCII中的字符 chr(99) 返回'c'
str() 将对象转化为适于人阅读的形式
any() 用于判断给定的可迭代参数 iterable 是否全部为空对象,如果都为空、0、false,则返回 False,如果不都为空、0、false,则返回 True
eval() 用来执行一个字符串表达式,并返回表达式的值。
isinstance() 来判断一个对象是否是一个已知的类型
sum() 方法对系列进行求和计算
issubclass() 用于判断参数 class 是否是类型参数 classinfo 的子类
super() 是用于调用父类(超类)的一个方法
bin() 返回一个二进制数
property() 在新式类中返回属性值。
bool() 将给定参数转换为布尔类型,如果没有参数,返回 False
filter() 用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
bytearray() 返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256
callable() 用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
locals() 以字典类型返回当前位置的全部局部变量
min() 返回给定参数的最小值
max() 返回给定参数的最大值
setattr() 函数对应函数 [getatt()],用于设置属性值,该属性必须存在。
dir() 用于查找
hex() 转换成16进制数
next() 返回迭代器的下一个项目。
slice() 实现切片对象,主要用在切片操作函数里的参数传递
id() 用于查看对象的内存地址
object() 返回一个对象
sorted() 对所有可迭代的对象进行排序操作
ascii() 返回字符在ASCII的中位置
oct() 转成8进制
exec() 执行储存在字符串或文件中的 Python 语句
pow() 返回 x,y(x的y次方) 的值。
bytes() 将字符串转成bytes格式
frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
vars() 返回对象object的属性和属性值的字典对象。
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
getattr() 用于返回一个对象属性值。
repr() 将对象转化为供解释器读取的形式
zip() 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
compile() 将一个字符串编译为字节代码。
globals() 用于修改全局的变量
map() 提供的函数对指定序列做映射
reversed() 反转列表的元索
import() 用于动态加载类和函数
delattr() 用于删除属性
hash() 用于获取取一个对象(字符串或者数值等)的哈希值
memoryview() 返回给定参数的内存查看对象(Momory view)
set() 创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等

**内置参数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii

posted @ 2018-05-15 16:40  游走在边缘的人  阅读(219)  评论(0编辑  收藏  举报