python函数的定义,python lambda函数的定义

之前简单写了一篇文章,描述了python中的循环和函数等,可能不是很详细,这里再扩展一下python函数的其他定义方式;

1.python中的函数定义是def关键字开头的;

# 函数定义 def关键字 后面是函数的名字
def funcName():
    print("python语言的第一个函数");

2.python和Java一样有无参有参的函数

# 无参函数,没返回值,但是python默认没有return的函数返回None;
def funcName():
    print("python语言的第一个函数");

# 有参函数,有返回值;
def testFunction(name, age):
    print('姓名是:' + name, "年龄是:" + str(age));
    return 3;

3.python定义了函数,有返回值,想要指定参数传递

def testFunction(name, age):
    print('姓名是:' + name, "年龄是:" + str(age));
    return 3;

# 调用
print(testFunction(name="1", age="1"));

4.python定义了函数,前面的不想指定传递,后面的想要指定参数传递;

# 注意这个函数中间多了个*号  命名关键字函数,这种函数定义不清楚有什么应用场景,感觉是个鸡肋;
def testFunction(name, age, *, sex):
    print('姓名是:' + name, "年龄是:" + str(age), "性别是:" + str(sex));
    return 3;


print(testFunction("1", 1, sex=1));

5.python定义函数,可以设置默认值,这个时候调用方不需要进行参数的传递,如果定义了默认值,调用方也传递了参数,那么会覆盖掉默认值的参数,这个比较灵活;(默认值参数定义必须定义在非默认值后面,否则会报错)

# 定义了默认值age1,被调用方可以不传递对应参数,否则必须传递,不然会报错
def testFunction1(name, age = 1):
    print(name, age);


print(testFunction1("张三"));

# 错误示例
def testFunction1(age = 1,name ):
    print(name, age);

6.python定义元组作为入参函数;

# 定义了元组参数类型的函数,在对应参数面前加* 拿取元组中的数据可以通过for循环,也可以使用下标进行数据的拿取;
def testFunction2(name, *names):
    print(name, names);


testFunction2("张三",1,2,3,4,5);

7.python定义字典作为入参函数;

# 定义了字典参数类型的函数,在对应参数面前加** 拿取元组中的数据可以通过for循环
def testFunction3(name, **Map):
    print("姓名是:{},map中的元素为:{}".format(name,Map) )
    print("遍历Map中的数据结果为------------------");
    for key,value in Map.items():
        print(f"key = {key},value = {value}");


testFunction3("张三", age=1, sex="男");

8.python定义多类型参数作为入参,这种用的比较少;

# 定义了字典参数类型的函数,在对应参数面前加** 拿取元组中的数据可以通过for循环
def testFunction4(name, *List, **Map):
    print("姓名是:{},元组中的元素为:{},map中的元素为:{}".format(name, List, Map))
    print("遍历Map中的数据结果为------------------");
    for key, value in Map.items():
        print(f"key = {key},value = {value}");


testFunction4("张三", 1, 2, 3, 4, age=1, sex="男");

9.递归函数,如果这种方式难以理解就使用for循环,下面的代码意思就是1到100每个数字相加得到的和,这种使用的比较少;

# 测试递归函数 和Java差不多,自己调自己,但是需要设定一个return的界限,否则会内存溢出;
def sum(num):
    if num == 1:
        return 1;
    return num + sum(num - 1);


print(sum(100));

10.函数中修改全局变量的值,使用global关键字;

# 在函数中如何使用全局变量
test_num = 1;


def change_num():
    global test_num;
    test_num = 2;
    print("局部变量数据为:{}".format(test_num));


change_num();
print("全局变量数据为:{}".format(test_num));

11.函数内部定义函数

# 函数内部定义函数
# outer_add外部函数 当你调用这个函数的时候传递了参数a,之后会调用内部函数进行实际的逻辑处理,和Java一样
def outer_add(a):
    def inner_add(b):
        return a + b;
# 返回内部函数,这里必须有,否则会报错
    return inner_add;


# 函数outer_add可以简单定义为oa;
oa = outer_add(100);
# outer_add函数中的a已经定义为了100,那么再调用简化的oa函数时,此时的oa中的变量20其实是inner_add(b)中的b的参数了
print(oa(20));

12.函数内部定义,如何在内部函数使用外部函数的参数;

# 函数内部定义函数 测试nonlocal关键字 这里不可以使用global,两个关键字的含义不同
def outer_add(num_a):
    def inner_add(num_b):
        nonlocal num_a;
        num_a += 1;
        return "测试第:{}次进入函数,内容为:{}".format(num_a,num_b);

    return inner_add;


# 函数outer_add可以简单定义为oa;
oa = outer_add(0);
print(oa("测试nonlocal关键字"));
print(oa("测试nonlocal关键字"));

2021-03-02更新;
线上昨天炸了一个下午,搞得都没时间摸鱼学python了,今天还分了更新迭代的开发任务,gouride领导;

12.python定义lambda函数以及使用(这个比Java就简单多了)

# 简单定义lambda函数 关键字lambda,这个函数在各种语言中都有,python中的相对而言简单一点;
sumAmount = lambda x,y:x+y;
print(sumAmount(1,2));

13.python中使用lambda定义闭包函数;

# 定义闭包的lambda函数
def testLambdaFunction(inputNumber):
    return lambda inputNumber2: inputNumber + inputNumber2;


testLambda = testLambdaFunction(100);
print(testLambda(100));

14.python中的主函数

# python不需要定义主函数就可以直接执行各种程序,这点和Java有很大的差异,但是python也内置了主函数,如下;
def testMain():
    print("我是python的主函数调用");


if __name__ == '__main__':
    testMain()

完整的函数定义代码如下;

# 函数定义 def关键字 后面是函数的名字
def funcName():
    print("python语言的第一个函数");


def testFunction(name, age):
    print('姓名是:' + name, "年龄是:" + str(age));
    return 3;


print(testFunction(name="1", age="1"));


# 注意这个函数中间多了个*号
def testFunction(name, age, *, sex):
    print('姓名是:' + name, "年龄是:" + str(age), "性别是:" + str(sex));
    return 3;


print(testFunction("1", 1, sex=1));


# 定义了默认值age1,被调用方可以不传递对应参数,否则必须传递,不然会报错
def testFunction1(name, age=1):
    print(name, age);


print(testFunction1("张三"));


# 错误示例
# def testFunction1(age = 1,name ):
#    print(name, age);


# 定义了元组参数类型的函数,在对应参数面前加* 拿取元组中的数据可以通过for循环,也可以使用下标进行数据的拿取;
def testFunction2(name, *names):
    print(name, names);


testFunction2("张三", 1, 2, 3, 4, 5);


# 定义了字典参数类型的函数,在对应参数面前加** 拿取元组中的数据可以通过for循环
def testFunction3(name, **Map):
    print("姓名是:{},map中的元素为:{}".format(name, Map))
    print("遍历Map中的数据结果为------------------");
    for key, value in Map.items():
        print(f"key = {key},value = {value}");


testFunction3("张三", age=1, sex="男");


# 定义了字典参数类型的函数,在对应参数面前加** 拿取元组中的数据可以通过for循环
def testFunction4(name, *List, **Map):
    print("姓名是:{},元组中的元素为:{},map中的元素为:{}".format(name, List, Map))
    print("遍历Map中的数据结果为------------------");
    for key, value in Map.items():
        print(f"key = {key},value = {value}");


testFunction4("张三", 1, 2, 3, 4, age=1, sex="男");


# 测试递归函数 和Java差不多,自己调自己,但是需要设定一个return的界限,否则会内存溢出;
def sum(num):
    if num == 1:
        return 1
    return num + sum(num - 1)


print(sum(100))

# 在函数中如何使用全局变量
test_num = 1;


def change_num():
    global test_num;
    test_num = 2;
    print("局部变量数据为:{}".format(test_num));


change_num();
print("全局变量数据为:{}".format(test_num));


# 函数内部定义函数
# outer_add外部函数 当你调用这个函数的时候传递了参数a,之后会调用内部函数进行实际的逻辑处理,和Java一样
def outer_add(a):
    def inner_add(b):
        return a + b;

    return inner_add;


# 函数outer_add可以简单定义为oa;
oa = outer_add(100);
# outer_add函数中的a已经定义为了100,那么再调用简化的oa函数时,此时的oa中的变量20其实是inner_add(b)中的b的参数了
print(oa(20));


# 函数内部定义函数 测试nonlocal关键字 这里不可以使用global,两个关键字的含义不同
def outer_add(num_a):
    def inner_add(num_b):
        nonlocal num_a;
        num_a += 1;
        return "测试第:{}次进入函数,内容为:{}".format(num_a, num_b);

    return inner_add;


# 函数outer_add可以简单定义为oa;
oa = outer_add(0);
print(oa("测试nonlocal关键字"));
print(oa("测试nonlocal关键字"));

# 简单定义lambda函数 关键字lambda,这个函数在各种语言中都有,python中的相对而言简单一点;
sumAmount = lambda x, y: x + y;
print(sumAmount(1, 2));


# 定义闭包的lambda函数
def testLambdaFunction(inputNumber):
    return lambda inputNumber2: inputNumber + inputNumber2;


testLambda = testLambdaFunction(100);
print(testLambda(100));


# python不需要定义主函数就可以直接执行各种程序,这点和Java有很大的差异,但是python也内置了主函数,如下;
def testMain():
    print("我是python的主函数调用");


if __name__ == '__main__':
    testMain()


# python内置的函数
"""
    callable()函数,判断函数是否可以被调用,可以返回true,失败返回false,(我第一眼看到还以为和Java中的多线程一样,没想到差距好大);
    例:callable(testMain);
    
    eval()函数,将程序作为字符串执行,只可以执行单行程序,有返回参数;
    例:eval("1 + 2");
    可以定义元组,集合,字典;
    例:eval([1,2,3]);
    
    exec()函数,将程序作为字符串执行,可以执行多行和单行字符串程序,没返回参数;
    例:str = "for item in range(1,10,2):" \
                "print(item,end='、')"
       result = exec(str);
       print(result);
       
    
    eval和exec这两个函数感觉和Java中的反射意思一样,我们不谈具体的实现,
    这两个函数的定义也是在系统运行时才进行编译和执行,
    用的多了肯定对系统的性能消耗是非常大的,
    如果要解决性能问题,
    那么需要提前对程序进行编译即可--使用compile()函数;
    因为是刚学python,不知道有什么具体的应用场景,感觉是python的骚操作,专门为了秀的;
    
    compile()函数 可以动态编译所需要执行的代码,有三种操作模式;
        model = "eval":     编译后的代码使用eval()函数执行处理,只允许执行单行代码;
            有返回值,单行计算表达式返回结果;
        model = "single":   编译后的代码使用exec()函数执行处理,定义单行表达式,此操作允许交互式的处理,执行单行代码:
            没有返回值,可以定义全局变量,对全局变量进行操作;
        model = "exec":     编译后的代码使用exec()函数执行处理,定义多行代码,
    
    例:
        # model = "eval":
        str = "100 + 100 + 100";
        compile三个入参,依次代表,执行的程序,执行的文件名字,使用什么模式
        testCompile = compile(str,"","eval"); #定义变量对象
        result = eval(testCompile); #执行代码
        print(result);
        
        # model = "single": 
        str = None;
        testCompile = compile("str = 1","","single");
        eval(testCompile); #执行代码
        print("str变量参数修改为{}".format(str));
        
        # model = "exec":
        str = "for item in range(1,10,2):" \
                "print(item,end='、')"
        testCompile = compile(str,"","exec");
        eval(testCompile); #执行代码
"""

上述函数的定义和学习来源于csdn中的视屏教学–python实战编程

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值