python-函数

 

函数

1、函数定义

## 定义函数
def test(x):
    # 说明函数功能
    x += 1
    return x

## 调用函数
print(test(4))
def test():
    pass

print(test)  ### 输出函数名  内存地址:<function test at 0x00D91108>

2、返回值

—过程:没有返回值(return)的函数 

— python 中 没有return,默认返回 None

— 返回值>1 ,返回一个tuple(元祖)

3、函数参数

— 形参     实参

— 一个参数不能传两遍值

— 位置参数一一对应,不多不少

—关键字参数,无需一一对应,不多不少

def test(x,y,z):
     print(x)
     print(y)
     print(z)

test(z=1,y=4,x=4)

— 位置参数必须在关键字参数的左边

— 默认参数

def test(x,y='gogo'):
     print(x,y)

test(1) ### y为默认参数   1 gogo
test(4,'not')  ### 传参覆盖y的默认值,  4 not

— 参数组

*列表  

def text(x,*args):
    print(x,args,args[4])

text(3,4,656,76,43,5,4)  ##  3 (4, 656, 76, 43, 5, 4) 5

text(3,*['d',2,'f'])  ## 3 ('d', 2, 'f')

**字典 

def test(x,**kwargs):
    print(x,kwargs)

test(4,y='fd',z='ew')  ###  4 {'y': 'fd', 'z': 'ew'}

 

def test(x,*args,**kwargs):
    print(x,args,kwargs)

test(4,'sdad',4,5,6,y='fd',z='ew')  ###  4 ('sdad', 4, 5, 6) {'y': 'fd', 'z': 'ew'}

  

4、全局变量,局部变量

— 全局变量名大写

— 局部变量名小写

name = '全局'

def change_name():
    name = '局部'
    print('change_name', name)

change_name()  ###  change_name 局部
print(name)  ### 全局

 

name = '全局'

def change_name():
    global name
    name = '局部'
    print('change_name', name)

change_name()  ## change_name 局部
print(name)  ### 局部

 

name = ['全局','变量']

def change_name():
    name.append('可操作')
    print('change_name', name)

change_name()  ###  change_name ['全局', '变量', '可操作']
print(name)  ### ['全局', '变量', '可操作']

 

5、函数嵌套

### 函数可嵌套,函数若不调用,不执行
def first():
    name = '第一层'
    print (name)
    def second():
        name = '第二层'
        print(name)
    second()
    print(name)

first()  ### 第一层
         ### 第二层

 

name = '全局'

def first():
    name = '局部'
    def second():
        global name
        name = '改变'
    second()
    print(name)

print(name)
first()
print(name)

### 全局
### 局部
### 改变

 

 6、递归

— 函数内部调用自身

— 有明确结束条件(死循环会报错)

 

import time

def calc(n):
    print(n)
    time.sleep(1) ## 停顿1s
    calc(n)

calc(10)

  

def cal(n):
    print(n)
    if int(n/2) == 0:
        return n
    return cal(int(n/2))

cal(10)  ### 10 5 2 1

  

7、作用域

def test1():
    print('test1')

def test():
    print('test')
    return  test1  ## return可以返回任何值

res = test()   ### 执行test(),返回函数名 test1
print(res)   ### 打印函数名(即函数的内存地址)<function test1 at 0x00A31108>  
print(res())  ### 执行test1() ,并将返回值打印,默认为None

  

name = '全局'
def first():
    name = '第一层'
    def second():
        name = '第二层'
        def third():
            print(name)
        return third
    return second

first()()()  #### 第二层

 

8、匿名函数

def calc(x):
    return x+1

print(calc(12))

### 可以表示为匿名函数的形式
### x是形参 : 操作并return出来
lambda  x:x+1   ### 类似于函数名,是内存地址

### 运行匿名函数
func = lambda x:x+1
print(func(10))  ### 11

  

9、高阶函数

(1)函数接收的参数是一个函数名

(2)返回资中包含函数

 

10、map函数 

map(func(函数功能),array(可迭代对象)):处理序列中的每个元素,得到的结果是一个‘列表’,该‘列表’元素的个数及位置与原来相同

num = [1, 2, 3, 4, 5, 6]

def map_test(func, array):
    ret = []
    for i in num:
        res = func(i)
        ret.append(res)
    return ret

print (map_test(lambda x: x + 1,num))  ###[2, 3, 4, 5, 6, 7]

### 用map 函数实现
s = map(lambda x:x**2,num)
print(list(s))  ###  [1, 4, 9, 16, 25, 36]

 

11、filter 函数(过滤)

filter(func(函数功能),array(可迭代对象)):遍历序列中每一个元素,判断元素是否满足条件得到布尔值,如果是True则保留

member = ['gogo','baba','kaka']

def filter_test(func,array):
    ret = []
    for p in member:
        if not func(p):
            ret.append(p)
    return  ret

res = filter_test(lambda n:str(n).endswith('a'),member)
print(res)  ### ['gogo']

### 用filter 函数实现
print(list(filter(lambda n:not str(n).endswith('a'),member)))

  

 12、reduce函数

filter(func(函数功能),array(可迭代对象),initial(初始值)):处理一个序列,对序列进行合并操作

### 列表元素相乘,设置初始值init
num = [1,2,3,4,5]

def reduce_test(func,array,init=None):
    if init is None:
        res = array.pop(0)
    else:
        res = init
    for num in array:
        res = func(res,num)
    return  res

print (reduce_test(lambda  x,y:x*y,num,10))


### reduce函数
from functools import reduce
print(reduce(lambda x,y:x*y,num,10))

  

 13、内置函数

### 内置函数

## 1、abs()  取负数
print(abs(-3))  ## 3

## 2、all()  取所有元素做布尔运算
## False: 0  ' '   None  []
## 可迭代对象为空,返回True
print(all([1,2,'re',0]))

## 3、any()  任意为真则为真
print(any([1,0,'']))

## 4、bin()  十进制转二进制
##    hex()  十进制转十六进制
##    oct()  十进制转八进制
print(bin(3))

## 5、bool()  布尔运算  False:空,None,0
print(bool(1))

## 6、bytes()  字节
name = '好'

print(bytes(name,encoding='utf-8'))  ## b'\xe5\xa5\xbd'   3字节一个汉字
print(bytes(name,encoding='utf-8').decode('utf-8'))

print(bytes(name,encoding='gbk'))  ## b'\xba\xc3'   2字节一个汉字
print(bytes(name,encoding='gbk').decode('gbk'))

#print(bytes(name,encoding='ascii'))  ## ascii码不能编码汉字

## 7、divmod()  商,余数
print(divmod(10,3))  ## (3, 1)

## 8、eval()
## 把字符串中的数据结构提取出来
## 把字符串中的数学运算进行运算
print(eval('2+3+4'))

## 9、hash()
## 可hash的数据类型,即不可变数据类型
## 判断是否被修改
name = 'hh'
print('before',hash(name))  ## before -1094276877

name = 'kk'
print('after',hash(name))   ##  after 210196591

## 10、isinstance()
print(isinstance(4,int)) ##  判断类型

## 11、globals() 打印全局变量
print(globals())
##    locals() 打印局部变量
print(locals())

## 12、 zip() 拉链  传序列   一一对应,多余舍去
##  序列:列表、元祖、字符串
print(list(zip(('a','s','d'),(1,2,3))))  ##[('a', 1), ('s', 2), ('d', 3)]

dic = {'name':'Amy','age':19,'gender':'female'}
print(list(zip(dic.keys(),dic.values())))
##  [('name', 'Amy'), ('age', 19), ('gender', 'female')]

print(list(zip('hello','123')))
## [('h', '1'), ('e', '2'), ('l', '3')]

  

min()  max()   

— 处理对象是可迭代类型,相当于循环每一个元素进行比较

— 不同类型元素无法比较

— 每个元素进行比较,是从元素第一个位置开始比较,如果这个位置比较出大小,后面位置可不用比较,直接得出大小

## 13、 max()  min()  最大最小值
## 不同类型不能进行比较
li = [1,2,3,45,6]
print(max(li))

### 字典中的最值
age_dic = {'age1':12,'age4':13,'age3':16}

print(max(age_dic))  ### 默认比较key  age4
print(max(age_dic.values())) ### 比较value 16

zip(age_dic.values(),age_dic.keys())  ## key 和 value 调换
print(max(zip(age_dic.values(),age_dic.keys())))  ## (16, 'age3')

people = [
    {'name':'Amy','age':45},
    {'name': 'Bob', 'age': 34},
    {'name': 'Lisa', 'age': 23},
    {'name': 'Lucy', 'age': 26},
]

print(max(people,key=lambda dic:dic['age']))   ## {'name': 'Amy', 'age': 45}

  

## 14、 chr()  打印ASCII码表中位置
##      ord()  与上面相反


## 15、pow()
print(pow(3,3))  ## 3**3
print(pow(3,3,2))  ## 3**3%2

## 16、reversed()  反转
print(list(reversed([1,2,3,4])))  ### [4, 3, 2, 1]

## 17、round()  四舍五入
print(round(8.7))  ## 9

## 18、slice()  切片
s = 'hello'
s1 = slice(3,5)
print(s[s1])  ## lo

  

## 19、sorted()  排序
li = [3,5,1,4,1,3]
print (sorted((li)))  ##  [1, 1, 3, 3, 4, 5]

## 列表排序
people = [
    {'name':'Amy','age':45},
    {'name': 'Bob', 'age': 34},
    {'name': 'Lisa', 'age': 23},
    {'name': 'Lucy', 'age': 26},
]

print(sorted(people,key=lambda dic:dic['age']))

## 字典排序
name_dic = {
    'Amy':99,
    'Haha':78,
    'Kaka':90
}
print(sorted(name_dic))  ### 默认根据key排序
print(sorted(name_dic,key=lambda  key:name_dic[key]))  ###  ['Haha', 'Kaka', 'Amy']
print(sorted(zip(name_dic.values(),name_dic.keys())))   ##  [(78, 'Haha'), (90, 'Kaka'), (99, 'Amy')]

  

## 20、sum()  求和
print(sum(range(5)))  ## 10

## 21、 type()  数据类型
print(type('we'))  ## <class 'str'>

## 22、 vars()

def test():
    ## 打印 {'msg': 'hello hello hi'}
    msg = 'hello hello hi'
    print(locals())
    print(vars())

test()

## 23、import   不能导入字符串模块名
##     __import__()   导入字符串模块名

  

 

posted @ 2019-01-13 18:15  kuluma  阅读(199)  评论(0编辑  收藏  举报