首页 > 其他分享 >函数

函数

时间:2023-01-05 17:57:32浏览次数:40  
标签:index return 函数 func print def

函数

"""
先定义后调用(函数名+括号)
函数名的命名规则跟变量名一样
函数在定义的时候只检测函数体语法,不执行函数体代码
函数名遇到括号会立即执行函数体代码
"""


# 定义: 
# 1.空函数
    def func(): 
        pass
# 2.无参函数
    def func(): 
        print('hello world')
# 3.有参函数
    def func(x, y, *args, **kwargs): 
        print('hello world')
        
        
def index(): 
    pass  # 第一种顶替方式(推荐使用pass)
    ...  # 第二种顶替方式

函数返回值 return

"""
函数内要想返回值给调用者,必须用关键字return,函数体遇到return直接结束整个函数的运行
所有的函数都有返回值,不写默认返回None
光写return或return None并不是为了考虑返回值,而是为了结束函数的运行
"""



def func(): 
    l = ['jason', 'egon', 'tank']
    while True: 
        for i in l: 
            if i == 'egon': 
                return  # 当i为egon时,直接结束函数运行
                print('abcdefg')  # 这一行代码永远都不会运行
            print(i)


            
# 不写return:  函数默认返回None

# 只写return:  返回None 

# 写return返回None:  跟只写return一样

# 写return返回一个值:  这个值可以是python任意数据类型

# 写return返回多个值:  将多个值以元组的形式返回给调用者

def func1(): 
    return 1, 2, 3, 4
print(func())  # (1, 2, 3, 4)

def func2(): 
    return 'a', 'b', 'c'  
print(func2())  # ('a', 'b', 'c')

def func3(): 
    return [1, 2], [1, 3], [2, 3]  
print(func3())  # ([1, 2], [1, 3], [2, 3]) 

def func4(): 
    return {'name':  'jason'}, {'age':  '18'}  
print(func4())  # ({'name':  'jason'}, {'age':  '18'})

# 写return返回多个值:  不想返回元组类型,可以加上你想返回的数据类型符号
def func5(): 
    return [[1, 2], [1, 3], [2, 3]]  
print(func5())  # [[1, 2], [1, 3], [2, 3]]

函数参数

"""
函数参数的两大类型: 
    形参: 在函数的定义阶段,括号内写的变量名,叫做该函数的形式参数,简称形参
    实参: 在函数的调用阶段,括号内实际传入的值,叫做实际参数,简称实参
    
形参与实参的关系: 
    形参就相当于变量名,而实参就相当于变量的值
    函数调用传参的过程,就是给形参赋值的过程
    
注意: 形参和实参的绑定关系只在函数的调用阶段有效,函数运行结束关系自动解除,只在函数内部有效,函数外部无任何影响
    
函数的简易结构: 
    def 函数名(形参1,形参2...): 
        '''函数的注释,用来描述该函数的作用以及各个形参的类型和return返回值'''
        函数体代码1
        函数体代码2
        ...
        return 函数的返回值
"""


def func(x, y): 
    """
    该函数的作用
    : param x:  对形参x的解释
    : param y:  对形参y的解释
    : return:  对函数返回值的解释
    """
    print('hahaha')
    return 'heihei'

print(help(func))  # 查看函数注释

位置参数

"""
位置形参: 在函数定义阶段按照位置从左往右依次书写的变量名,位置形参在调用的时候,必须为其传值,有几个传几个
位置实参: 在函数的调用阶段
	位置传参: 直接按照位置传,一一对应
	关键字传参: 指名道姓的传

注意: 在函数的调用阶段,位置传参和关键字传参可以混合使用,但是必须保证
    1.位置传参必须在关键字传参的前面
    2.同一个形参不能被多次赋值
"""



# 比较两个数的大小,返回大的那个
def my_max(x,y):   # 位置形参
    print(x,y)
    if x > y: 
        return x
    else: 
        return y

# 位置传参
print(my_max(1,3))
print(my_max(1))  # 在调用函数时,少一个实参不行
print(my_max(1,2,3))  # 在调用函数时,多一个实参也不行

# 关键字传参
print(my_max(y=20,x=10))

# 位置传参和关键字传参混合使用
print(my_max(10,y=20))  

默认值参数

"""
默认值参数: 在函数的定义阶段,形参(变量名)就已经被赋值了
在调用的时候可以不为默认值形参传值,默认使用定义阶段就已经绑定的值
在调用的时候如果给默认值形参传值,那么就使用你传的值
在定义阶段,默认值形参必须放在位置形参的后面

函数在定义阶段,内部所使用的变量都已经初始化完毕了,不会因为调用位置变化,而影响到内部的值(暂时可忽略)
函数无论在什么地方被调用,都会跑到函数定义阶段去执行代码,形参中用到的值都是往函数定义阶段代码之上找
"""



def my_max(x,y=100): 
    if x > y: 
        return x
    return y
print(my_max(200))  # y使用默认值参数
print(my_max(200,1000))  # y使用传的值



# 默认值参数问题
def info(username,hobby,l=[]): 
    l.append(hobby)
    print('%s 的爱好是 %s'%(username,l))
info('jason','read')  # jason 的爱好是 ['read']
info('tank','study')  # tank 的爱好是 ['read', 'study']

# 解决方法1: 不使用默认的自己传参
info('jason','read',[])  # jason 的爱好是 ['read']
info('tank','study',[])  # tank 的爱好是 ['study']

# 解决方法2: 
def info(username,hobby,l=None): 
    if l == None: 
        l = []
    l.append(hobby)
    print('%s 的爱好是 %s'%(username,l))
info('jason','read')  # jason 的爱好是 ['read']
info('tank','study')  # tank 的爱好是 ['study']

可变长参数

"""
用*和**来接收多余的(溢出的)位置参数和关键字参数
    *在形参中能够接受多余的位置参数,组织成一个元祖赋值给*后面的变量名
    **在形参中能够接受多余的关键字参数,组织成一个字典赋值给**后面的变量名
     
    *在实参中能够将、列表、元祖、集合打散成位置实参的形式传递给函数,*就看成是for循环取值
    **在实参中能够将字典打散成key=value的形式按照关键字参数传递给函数
"""



# 站在形参的角度,看 *
# 形参中的*会将多余的(溢出的)位置实参,统一用元组的形式处理,传递给*后面的形参名
# *在形参中只能接收多余的位置实参,不能接收关键字实参
def func(x,y,*z): 
    print(x,y,z)
func(1,2,3,4,5,6)  # 1 2 (3, 4, 5, 6)



# 站在实参的角度,看 *
# *只能将字符串、列表、元组、集合打散成位置实参一一传入,*的内部看成是for循环
def func(x,y,z): 
    print(x,y,z)
func(*[1,2,3])  # *会将列表打散成位置实参一一传入,等价于func(1,2,3)

def func(x,*z): 
    print(x,z)
func(1,*{1,2,3})  # 1 (1, 2, 3)



# 站在形参的角度,看 **
# **会接收所有多余的关键字参数,并将关键字参数转换成字典形式,字典的key为关键字的名字,字典的value为关键字的名字指向的值,将字典交给**后面的变量名
def func(x,y,**z): 
    print(x,y,z)
func(1,2,a=1,b=2,c=3)  # 1 2 {'a':  1, 'b':  2, 'c':  3}
func(x=1,y=2,a=1,b=2,c=3)  # 1 2 {'a':  1, 'b':  2, 'c':  3}



# 站在实参的角度,看 **
# **会将字典拆封成key=value的形式
def func(x,y,z): 
    print(x,y,z)
func(**{'x': 1,'y': 2,'z': 3})  # 等价于func(x=1,y=2,z=3)



# 需求: 你写的函数,调用者按照正确传参方式无论怎么传,你的函数都能够正常执行
def func1(*x,**y): 
    print(x,y)
func1(1,2,x=1,y=2,z=3)  # (1, 2) {'x':  1, 'y':  2, 'z':  3}



# python推荐形参中*和**通用写法
def func2(*args,**kwargs): 
    print(args,kwargs)

命名关键字参数

# 在函数定义阶段,写在*与**可变长参数之间的形参
# 在给命名关键字参数传值的时候,只能用关键字为其传值
# 在定义阶段,感觉好像是z是默认值参数放在了m这个位置参数的前面了,应该报错,其实z和m都是命名关键字参数,不是默认值参数和位置参数
def func(x,y=1,*args,z=3,m,**kwargs): 
    print(x,y)  # 1 2
    print(args)  # (1, 2, 3)
    print(z,m)  # 69 999
    print(kwargs)  #{'o':  666999, 'l':  999666}
func(1,2,1,2,3,z=69,m=999,o=666999,l=999666)

函数对象

# 函数是第一类对象: 函数名指向的值可以被当做参数传递



# 1.函数名可以被传递
def func(): 
    print('from func')
print(func)  # <function func at 0x0000028D0566F1F0>
f = func
print(f)  # <function func at 0x0000028D0566F1F0>



# 2.函数名可以被当做参数传递给其他函数
def func(): 
    print('from func')
def index(args): 
    print(args)
    args()
index(func)  # <function func at 0x000001C8B572E160>  from func



# 3.函数名可以被当做函数的返回值
def index(): 
    print('index')
def func(): 
    return index
res = func()
print(res)  # <function index at 0x0000021D260FE160>
res()  # index



# 4.函数名可以被当做容器类型的参数
def func(): 
    return 'func'
l = [1,2,func,func()]
print(l)  # [1, 2, <function func at 0x0000024DEBFEE160>, 'func']



# 示例: 循环打印项目功能提示信息,供用户选择,用户选择谁就执行谁
def register(): 
    print('register ...')
def login(): 
    print('login ...')
def transfer(): 
    print('transfer ...')

msg = """
1 注册
2 登陆
3 转账
"""

func_dict = {
    '1': register,
    '2': login,
    '3': transfer,
}

while True: 
    print(msg)
    choice = input('请输入你想执行的功能>>>: ').strip()
    if choice in func_dict: 
        func_dict.get(choice)()  # 函数名()
    else: 
        print('输入错误')

函数的嵌套调用

# 在函数内部调用其他函数,可以将复杂的逻辑简单化

def index(): 
    print('index')
def func(): 
    index()
func()  # index


def my_max(x,y): 
    if x > y: 
        return x
    return y
def my_max4(a,b,c,d): 
    res1 = my_max(a,b)
    res2 = my_max(res1,c)
    res3 = my_max(res2,d)
    return res3
print(my_max4(1,2,10,4))  # 10

函数的嵌套定义

def outer(): 
    x = 1
    print('outer')
    def inner(): 
        print('inner')
outer()  # outer
print(x)  # NameError:  name 'x' is not defined 外层不能访问函数体内部代码
print(inner)  # NameError:  name 'inner' is not defined



def outer(): 
    x = 1
    print('outer')
    def inner(): 
        print('inner')
    inner()
outer()  # outer  inner 函数体内部可以访问函数体内部代码



def outer(): 
    x = 1
    print('outer')
    def inner(): 
        print('inner')
    return inner
res = outer()  # outer
print(res)  # <function outer.<locals>.inner at 0x0000029F26891D30>
res()  # inner



# 示例: 写一个函数,该函数用户可以通过传参的不同控制函数执行不同的功能

def all_funx(type): 
    def register(): 
        print('register')
    def login(): 
        print('login')
    def shopping(): 
        print('shopping')

    if type == '1': 
        register()
    elif type == '2': 
        login()
    elif type == '3': 
        shopping()

all_funx('1')  

闭包函数

# 闭: 定义在函数内部的函数
# 包: 内部函数引用了外部函数作用域的名字
def outter(): 
    x = 111
    def inner(): 
        print(x)
    return inner
res = outter()  # res就是inner函数的内存地址
x = 222
res()  # 111
def func(): 
    x = 333
    res()
func()  # 111



# 给函数体传值的两种方式
# 第一种方式: 传参
def index(name): 
    print(name)

# 第二种方式: 闭包
def outter(x,y): 
    def my_max(): 
        if x > y: 
            return x
        return y
    return my_max
res1 = outter(1,40)  # res1就是my_max函数的内存地址
print(res1())  # 40



# 示例: 
import requests

# 传参
def my_get(url): 
    response = requests.get(url)
    if response.status_code == 200: 
        print(response.text)
my_get('https: //www.baidu.com')

# 闭包
def outter(url): 
    def my_get(): 
        response = requests.get(url)
        if response.status_code == 200: 
            print(response.text)
    return my_get
my_jd = outter('https: //www.jd.com')
my_jd()

装饰器

装饰器

"""
装饰器: 给被装饰对象添加新的功能的工具
开放封闭原则: 
    开放: 对扩展开放
    封闭: 对修改封闭
装饰器必须遵循的两个原则: 
    1.不改变被装饰对象源代码
    2.不改变被装饰对象调用方式
"""



# 示例: 统计index函数执行的时间

# 简单版
import time

def index(): 
    time.sleep(3)
    print('结束啦')

def outter(func):   # func为最原始的index函数的内存地址
    def get_time(): 
        start = time.time()
        func()  # func为最原始的index函数的内存地址,直接调用
        end = time.time()
        print('index run time: %s'%(end-start))
    return get_time

index = outter(index)  # outter(最原始的index函数内存地址),index指向get_time函数的内存地址
index()  # 结束啦  index run time: 3.0007338523864746


# 升级版
"""
函数参数的问题: 
    无参函数和有参函数都可以直接调用
    函数可以接收任意数量的参数
    能返回之前函数的返回值
"""
import time

def index(): 
    time.sleep(3)
    print('结束啦')
    return 'index'

def login(name): 
    time.sleep(1)
    print('%s is sb'%name)
    return 'login'

def outter(func):   
    def get_time(*args, **kwargs):   # args = ('egon',) kwargs = {}
        start = time.time()
        res = func(*args, **kwargs)  # 最原始的login函数的内存地址(),直接调用,login('egon')
        end = time.time()
        print('func run time: %s'%(end-start))
        return res
    return get_time

login = outter(login)
res = login('egon')  # egon is sb  func run time: 1.006035327911377
print(res)  # login

index = outter(index) 
res1 = index()  # 结束啦  func run time: 3.004805326461792
print(res1)  # index

装饰器语法糖

# 语法糖写时应该与被装饰对象紧挨着,两者之间不要有空行

import time

def outter(func):   
    def get_time(*args, **kwargs): 
        start = time.time()
        res = func(*args, **kwargs)  
        end = time.time()
        print('func run time: %s'%(end-start))
        return res
    return get_time

@outter  # index = outter(index),index = outter(最原始的index函数的内存地址),这个就是装饰器语法糖
def index(): 
    time.sleep(3)
    print('结束啦')
    return 'index'

@outter  # login = outter(login)
def login(name): 
    time.sleep(1)
    print('%s is sb'%name)
    return 'login'

@outter  # home = outter(home)
def home(*args,**kwargs): 
    time.sleep(1)
    return 'home'

index()
login('egon')
home()



# 示例: 认证装饰器,执行函数index之前判断用户登入状态,已登入则执行,未登入则需登入,用户名密码正确才能执行,修改用户登入状态,否则提示用户输入错误,结束程序

import time

user_dic = {'is_login': None}

def login_auth(func): 
    def inner(*args,**kwargs): 
        if user_dic['is_login']: 
            res = func(*args, **kwargs)
            return res
        else: 
            username = input('please input your username>>>: ').strip()
            password = input('please input your password>>>: ').strip()
            if username == 'jason' and password == '123': 
                user_dic['is_login'] = True
                res = func(*args,**kwargs)
                return res
            else: 
                print('username or password error')
    return inner

@login_auth
def index(name): 
    time.sleep(1)
    print('%s is dsb'%name)
    return 666

index('egon')

多层装饰器

# 双层装饰器
import time
user_dic = {'is_login': None}

def outter(func):   
    def get_time(*args, **kwargs): 
        start = time.time()
        res = func(*args, **kwargs)  
        end = time.time()
        print('func run time: %s'%(end-start))
        return res
    return get_time

def login_auth(func): 
    def inner(*args,**kwargs): 
        if user_dic['is_login']: 
            res = func(*args, **kwargs)
            return res
        else: 
            username = input('please input your username>>>: ').strip()
            password = input('please input your password>>>: ').strip()
            if username == 'jason' and password == '123': 
                user_dic['is_login'] = True
                res = func(*args,**kwargs)
                return res
            else: 
                print('username or password error')
    return inner

# 装饰器语法糖嵌套,装饰的时候从下往上执行
@login_auth  # index = login_auth(get_time),index = inner函数的内存地址
@outter  # get_time = outter(index),index是最原始的index
def index(): 
    time.sleep(1)
    print('from index')
    return 'index'

print(index())



#有参装饰器,三层装饰器
import time
user_dic = {'is_login': None}

def outter(func): 
    def get_time(*args, **kwargs): 
        start = time.time()
        res = func(*args, **kwargs)
        end = time.time()
        print('func run time: %s'%(end-start))
        return res
    return get_time

def login_auth2(data_source,x,y): 
    # data_source = 'file'
    def login_auth(func): 
        # func = index
        def inner(*args,**kwargs): 
            if user_dic['is_login']: 
                res = func(*args, **kwargs)
                return res
            else: 
                if data_source == 'file': 
                    username = input('please input your username>>>: ').strip()
                    password = input('please input your password>>>: ').strip()
                    if username == 'jason' and password == '123': 
                        user_dic['is_login'] = True
                        res = func(*args,**kwargs)
                        return res
                    else: 
                        print('username or password error')
                elif data_source == 'MySQL': 
                    print('from MySQL')
                elif data_source == 'LDAP': 
                    print('from LDAP')
                else: 
                    print('暂无该数据来源')
        return inner
    return login_auth

@login_auth2('MySQL',1,2)  # @login_auth2('file',1,2) => @login_auth,并且带参 data_source='file'、x=1、y=2
@outter
def index(): 
    time.sleep(1)
    print('from index')
    return 'index'

index()

装饰器修复技术

"""
若没有用装饰器修复技术,则看被装饰器函数的内存地址、函数名和注释为装饰器内部函数的函数名和注释
装饰器修容技术可以解决: 
    用户查看被装饰函数的内存地址时就是被装饰函数的内存地址
    用户查看被装饰函数的函数名时就是被装饰函数的函数名
    用户查看被装饰函数的注释时就是被装饰函数的注释
"""

from functools import wraps
def outter(func): 
    @wraps(func)  # 装饰器修复技术
    def inner(*args,**kwargs): 
        """
        我是inner函数
        : param args: 
        : param kwargs: 
        : return: 
        """
        print('执行被装饰函数之前 你可以执行的操作')
        res = func(*args,**kwargs)
        print('执行被装饰函数之后 你可以执行的操作')
        return res
    return inner

@outter  # index = outter(最原始的index函数的内存地址)
def index(): 
    """
    我是index函数
    : return: 
    """
    pass

print(index)  # index函数的内存地址
print(help(index))  # index函数的注释
print(index.__name__)  # index函数的函数名,FUNC__name__: 查看函数名

装饰器模板

# 1.无参装饰器
from functools import wraps
def outter(func): 
    @wraps(func)
    def inner(*args,**kwargs):   # * **在形参中使用
        print('执行被装饰函数之前你可以做的操作')
        res = func(*args,**kwargs)  # * **在实参中使用
        print('执行被装饰函数之后你可以做到操作')
        return res
    return inner

@outter
def index(name,*args,**kwargs): 
    """index注释"""
    pass


# 2.有参装饰器(最复杂就三层)
def wrappers(data): 
    def outter(func): 
        def inner(*args,**kwargs): 
            if data == 'file': 
                print('执行被装饰函数之前你可以做的操作')
                res = func(*args,**kwargs)  # * **在实参中使用
                print('执行被装饰函数之后你可以做到操作')
                return res
        return inner
    return outter

@wrappers('file')
def index(name,*args,**kwargs): 
    """index注释"""
    pass

递归函数

"""
函数在调用阶段直接或间接的又调用自身
递归分为两个阶段: 
    1.回溯: 就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度下降,直到最终的结束条件
    2.递推: 一次次往回推导的过程
"""



# 函数递归深度限制
import sys
print(sys.getrecursionlimit())  # 1000 获取函数递归深度限制,不是很精确
sys.setrecursionlimit(1000)  # 设置函数递归深度限制

def func(n): 
    print('from func',n)
    func(n+1)
func(1)  # 函数递归深度限制,大概997、998



# 示例1: 
"""
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18

age(n) = age(n-1) + 2  # n > 1
age(1) = 18  # n = 1
"""
def age(n): 
    if n == 1:   # 必须要有结束条件
        return 18
    return age(n-1) + 2
print(age(5))  # 26



# 示例2: 将列表中的数字依次打印出来
l = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,]]]]]]]]]]
def get_num(list): 
    for i in list: 
        if type(i) is int: 
            print(i)
        else: 
            get_num(i)
get_num(l)  



# 示例3: 二分法,容器类型里面的数字必须有大小顺序
l = [1,3,5,12,57,89,101,123,146,167,179,189,345]
num = 666

def get_num(list,target_num): 
    if not list: 
        print('列表不存在')
        return
    print(list)
    # 获取列表中间的索引
    middle_index = len(list) // 2
    # 比较target_num和middle_index大小
    if target_num > list[middle_index]: 
        # 切取列表右半部分
        num_right = list[middle_index + 1: ]
        # 再递归调用get_num函数
        get_num(num_right,target_num)
    elif target_num < list[middle_index]: 
        # 切取列表左半部分
        num_left = list[0: middle_index]
        # 再递归调用get_num函数
        get_num(num_left, target_num)
    else: 
        print('find it',target_num)

get_num(l,num)

匿名函数

"""
没有名字的函数,临时存在用完就没了

lambda x,y: x+y
    : 左边相当于函数的形参
    : 右边相当于函数的返回值

匿名函数通常不会单独使用,而是配合内置函数一起使用
"""

res = (lambda x,y: x+y)(1,2)
print(res)  # 3


# 给匿名函数命名
func = lambda x,y: x+y
print(func)  # <function <lambda> at 0x0000027ED663F160>
print(func(1,2))  # 3

常用的内置函数

# 1. max() min()
l = [1,2,3,4,5]
print(max(l))  # 5

d = {
    'egon': 30000,
    'jason': 88888,
    'nick': 3000,
    'tank': 1000
}

print(max(d))  # tank max内部是基于for循环的,字典里比的是索引的第一个字母在ASCII码中对应的大小
"""
ASCII码
A-Z  65-90
a-z  97-122
"""

def index(name): 
    return d[name]
print(max(d,key=index))  # jason max字典比较,如果传了key,则会把for循环拿到的key作为参数传给后面的index函数执行,最后比较的是函数执行的结果,返回的还是for循环的key
print(max(d,key=lambda name: d[name]))  # jason 使用匿名函数
print(min(d,key=lambda name: d[name]))  # tank min和max一样


# 2. map() 映射,基于for循环
l = [1,2,3,4,5]
print(list(map(lambda x: x+1,l)))  # [2, 3, 4, 5, 6]


# 3. zip() 拉链,基于for循环
l1 = [1,2,3,4]
l2 = ['jason','egon','tank']
l3 = ['a','b',]
print(list(zip(l1,l2)))  # [(1, 'jason'), (2, 'egon'), (3, 'tank')]
print(list(zip(l1,l2,l3)))  # [(1, 'jason', 'a'), (2, 'egon', 'b')]


# 4. filter() 过滤,基于for循环
l = [1,2,3,4,5]
print(list(filter(lambda x: x != 3,l)))  # [1, 2, 4, 5]


# 5. sorted() 对序列(列表、元组、字典、集合、字符串)进行排序
# 语法: list = sorted(iterable, key=None, reverse=False)  # iterable 表示指定的序列,key参数可以自定义排序规则;reverse 参数指定以升序(False,默认)还是降序(True)进行排序。sorted()函数会返回一个排好序的列表
l1 = ['jason','egon','nick','tank']
l2 = [32,12,55,3,656,30]
print(sorted(l1))  # ['egon', 'jason', 'nick', 'tank'] 按首字母排序
print(sorted(l1,reverse=True))  # ['tank', 'nick', 'jason', 'egon'] reverse=True降序
print(sorted(l2))  # [3, 12, 30, 32, 55, 656]
print(sorted(l2,reverse=True))  # [656, 55, 32, 30, 12, 3]
#另外在调用sorted()函数时,还可传入一个key参数,它可以接受一个函数,该函数的功能是指定sorted()函数按照什么标准进行排序。例如:
chars=['http://c.biancheng.net',\
       'http://c.biancheng.net/python/',\
       'http://c.biancheng.net/shell/',\
       'http://c.biancheng.net/java/',\
       'http://c.biancheng.net/golang/']
print(sorted(chars,key=lambda x:len(x)))  # 自定义按照字符串长度排序


# 6. reduce() 将多个值变成一个值,变的过程依据你传入的函数
from functools import reduce
l = [1,2,3,4,5]
print(reduce(lambda x,y: x+y,l))  # 15 1+2->+3->+4->+5,第一次先获取两个元素相加,之后每次获取一个元素与上一次相加的结果再相加
print(reduce(lambda x,y: x+y,l,18))  # 33 18为初始值,18 >+1->+2->+3->+4->+5


# 7. abs() 求绝对值
print(abs(-11.11))  # 11.11


# 8. all() any() 
print(all([0,1,2]))  # False 传入可迭代对象,只要有一个值为False就返回False
print(any([0,1,2]))  # True 传入可迭代对象,只要有一个值为True就返回True


# 9. bool() 转化为布尔值
print(bool(1))  # True
print(bool(0))  # False


# 10. callable() 判断是否可调用
l = [1,2,3]
def index(): 
    pass
print(callable(l))  # False
print(callable(index))  # True


# 11. chr() ord()
print(chr(97))  # a 将数字转换成ascii码对应的字符
print(ord('a'))  # 97 将字符转换成ascii码对应的数字


# 12. dir() 获取当前对象所在的名称空间里的所有名字,返回的是列表
l = [1,2,3]
print(dir(l))


# 13. divmod() 分页器
print(divmod(101,10))  # (10, 1) 101除以10等于10余1


# 14. eval() exec()
# 识别字符串里的代码自动执行返回结果,eval不支持逻辑代码(赋值、for循环等),只支持简单的代码;exec支持逻辑代码
s = """
print('hello baby~')
x = 1
y = 2
print(x + y)
"""
eval(s)
exec(s)


# 15. globals() locals()
# globals() 字典的形式访问全局变量
# locals() 字典的形式访问局部变量,返回的是当前局部变量的深拷贝,修改locals()中变量值对原变量没有影响
b = 5
def index(): 
    a = 1
    locals()['a'] = 2
    globals()['b'] = 6
    print(locals())  # {'a':  1}
    print(globals())  # {'b':  6,...}
index()    


# 16. help() 查看注释
def login(): 
    """
    登入
    : return: 
    """
print(help(login))


# 17. isinstance() 判断对象是否属于某一类型
print(isinstance(1,list))  # False


# 18. pow()
print(pow(2,3))  # 8 计算2的三次方


# 19. round()
print(round(3.5))  # 4 四舍五入取整数

标签:index,return,函数,func,print,def
From: https://www.cnblogs.com/jlllog/p/17028457.html

相关文章

  • Python 函数
    一.函数的初识函数:以功能(完成一件事)为导向,登录,注册,len一个函数就是一个功能。随调随用函数的优势1.减少了代码的重复性。2.增强了代码的可读性 二.函数的结构和调用......
  • C#调用VC的DLL的接口函数参数类型转换一览表
    handle---------IntPtrhwnd-----------IntPtrchar*----------stringint*-----------refintint&-----------refintvoid*----------IntPtrunsignedchar*-----refbyt......
  • 浅谈多项式与生成函数
    本文源码约34k,可能需要一段时间加载\(\LaTeX\)。首先需要注意的是,本文中将不会涉及具体的程式化求解,即与代码实现无关。同样的,阅读本文需要你掌握基础的快速傅里叶变换......
  • gcc内置原子操作__sync_系列函数解析
    gcc内置原子操作__sync_系列函数解析gcc4.1.2版本之后,对X86或X86_64支持内置原子操作。就是说,不需要引入第三方库(如pthread)的锁保护,即可对1、2、4、8字节的数值或指针类......
  • 箭头函数与promise
    console.log("普通函数方式");vararr1=[1,2,3,4,5];arr1.forEach(function(e){console.log(e);});console.log("箭头函数......
  • 为什么 Python 中没有 main() 函数?
    在本文中,我们将学习为什么Python中没有main()函数。毫无疑问,Python没有所谓的main函数,但是,关于互联网经常引用“Python的主要功能”和“建议编写主要功能。"它们的目......
  • c#的构造函数及构造函数的调用
    C#构造函数的特性一、什么是C#构造函数?Construct,Function   C#构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.   C#构造......
  • Vue3路由的redirect重定向结合函数实现不同的用户身份跳转到不同的首页
    访问网页主域名的时候,识别用户身份跳转到不同的首页,配置路由重定向constroutes:Array<RouteRecordRaw>=[//访问主域名的时候,根据用户的登录信息,重定向到不同的页......
  • Unity3D常用函数说明
    Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结。 Awake当前控......
  • 【Azure 应用服务】Azure Function Python函数中,如何获取Event Hub Trigger的消息Even
    问题描述在通过AzureFunction消费EventHub中的消息时,我们从Function的 TriggerDetails日志中,可以获得当前Funciton中处理的消息是哪一个分区(PartitionID),偏移量O......