GVKun编程网logo

Python Lambda不接受元组参数(python类不接受任何参数)

14

在这里,我们将给大家分享关于PythonLambda不接受元组参数的知识,让您更了解python类不接受任何参数的本质,同时也会涉及到如何更有效地2.3.6Python匿名函数lambda、C#中La

在这里,我们将给大家分享关于Python Lambda不接受元组参数的知识,让您更了解python类不接受任何参数的本质,同时也会涉及到如何更有效地2.3.6 Python 匿名函数 lambda、C# 中 Lambda 表达式类型 Expression 不接受 lambda 函数、lambda函数 python、Python - 通过 lambda 函数传递的参数不保留其状态的内容。

本文目录一览:

Python Lambda不接受元组参数(python类不接受任何参数)

Python Lambda不接受元组参数(python类不接受任何参数)

我在装有Linux和Windows的两台PC上运行带有PyDev v2.6插件的Eclipse SDK v3.6。

我想将元组作为参数传递,例如(仅作为示例):

foo = lambda (x,y): (y,x)print (foo((1,2)))

这可以在Linux上运行并给出结果:

(2,1)

在Windows上,它会引发错误:

foo = lambda (x,y): (y,x)             ^SyntaxError: invalid syntax

该如何解决呢?

答案1

小编典典

您可能在Windows上运行Python 3.x,在Linux上运行Python2.x。解包元组参数的功能已在Python 3中删除:请参阅PEP
3113。

您可以改为手动解压缩元组,这将在Python 2.x和3.x上都可以使用:

foo = lambda xy: (xy[1],xy[0])

要么:

def foo(xy):    x,y = xy    return (y,x)

2.3.6 Python 匿名函数 lambda

2.3.6 Python 匿名函数 lambda

#例1
#这段代码
def calc(x,y):
    return x**y

print(calc(2,5))

#换成匿名函数
calc = lambda x,y:x**y
print(calc(2,5))


''''''
lambda 不支持复杂的语句,最多支持三元运算
func = lambda x,y: if x > y: x*y 
''''''

#例2

def calc(x,y):
    if x<y:
        return x**y
    else:
        return x/y

func = lambda x,y: x*y if x<y else x/y


print(calc(2,5))
print(func(16,8))

匿名函数最主要的作用就是和其他函数配合使用

1.节省代码量

2.看着高级

例:


data = [1,3,5,7,9]

for i in data:
    print(i**2)

print(list(map(lambda x:x**2, data)))

 

C# 中 Lambda 表达式类型 Expression 不接受 lambda 函数

C# 中 Lambda 表达式类型 Expression 不接受 lambda 函数

在 EF Core 中我们经常会用 System.Linq.Expressions 系统命名空间的 Expression<TDelegate> 类型来作为 EF Core 的查询条件,比如:

using EFLambdaExpression.Entities;
using System;
using System.Linq;
using System.Linq.Expressions;

namespace EFLambdaExpression
{
    class Program
    {
        static void Main(string[] args)
        {
            using (FinanceDigitalToolContext dbContext = new FinanceDigitalToolContext())
            {
                Expression<Func<User, bool>> userExperssion = u => u.UserCode != null;

                var users = dbContext.User.Where(userExperssion).ToList();
            }

            Console.WriteLine("Press key to quit....");

            Console.ReadLine();
        }
    }
}

但是如果我们将 Expression<Func<User, bool>> userExperssion = u => u.UserCode != null 改为 Expression<Func<User, bool>> userExperssion = u => { return u.UserCode != null; } 那么 C# 会报错,提示:

A lambda expression with a statement body cannot be converted to an expression tree

所以 Expression<Func<User, bool>> userExperssion 不能接受带函数体的 u => { return u.UserCode != null; } 这种 lambda 函数,它只支持简单的 lambda 表达式 u => u.UserCode != null

 

虽然 Expression<Func<User, bool>> userExperssion 右边的 lambda 表达式中可以使用自定义函数,但是不建议这么做,因为这么做会导致 EF Core 对数据库表做全表查询

比如我们先执行下面的代码:

using EFLambdaExpression.Entities;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Linq.Expressions;

namespace EFLambdaExpression
{
    class Program
    {
        static void Main(string[] args)
        {
            using (FinanceDigitalToolContext dbContext = new FinanceDigitalToolContext())
            {
                Expression<Func<User, bool>> userExperssion = u => EF.Functions.Like(u.UserCode, "%ADMIN%");

                var users = dbContext.User.Where(userExperssion).ToList();
            }

            Console.WriteLine("Press key to quit....");

            Console.ReadLine();
        }
    }
}

可以从 EF Core 的日志中看到生成了如下 SQL 语句:

=============================== EF Core log started ===============================
Executed DbCommand (122ms) [Parameters=[], CommandType=''Text'', CommandTimeout=''30'']
SELECT [u].[ID], [u].[CompanyCode], [u].[CreateTime], [u].[DataStatus], [u].[FirstName], [u].[LastName], [u].[MailAddress], [u].[MiddleName], [u].[Password], [u].[UserCode], [u].[Username]
FROM [MD].[User] AS [u]
WHERE [u].[UserCode] LIKE N''%ADMIN%''
=============================== EF Core log finished ===============================

因为 EF.Functions.Like 方法是 EF Core 定义的系统函数,所以我们看到 EF Core 可以将该 C# 方法转换为 SQL 查询中的 LIKE 语句作为查询的 WHERE 条件。

 

如果现在我们将 EF.Functions.Like 的调用放到我们自定义的一个 C# 方法 UserCodeLike 中去,然后在 Expression<Func<User, bool>> userExperssion 右边的 lambda 表达式中调用自定义方法 UserCodeLike,代码如下所示:

using EFLambdaExpression.Entities;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Linq.Expressions;

namespace EFLambdaExpression
{
    class Program
    {
        static bool UserCodeLike(User user, string pattern)
        {
            return EF.Functions.Like(user.UserCode, pattern);
        }

        static void Main(string[] args)
        {
            using (FinanceDigitalToolContext dbContext = new FinanceDigitalToolContext())
            {
                Expression<Func<User, bool>> userExperssion = u => UserCodeLike(u, "%ADMIN%");

                var users = dbContext.User.Where(userExperssion).ToList();
            }

            Console.WriteLine("Press key to quit....");

            Console.ReadLine();
        }
    }
}

可以从 EF Core 的日志中看到生成了如下 SQL 语句:

=============================== EF Core log started ===============================
Executed DbCommand (124ms) [Parameters=[], CommandType=''Text'', CommandTimeout=''30'']
SELECT [u].[ID], [u].[CompanyCode], [u].[CreateTime], [u].[DataStatus], [u].[FirstName], [u].[LastName], [u].[MailAddress], [u].[MiddleName], [u].[Password], [u].[UserCode], [u].[Username]
FROM [MD].[User] AS [u]
=============================== EF Core log finished ===============================

可以看到,虽然最后查出来的结果是一样的,但是这次 EF Core 对 User 表做了全表查询,在 SQL 的查询语句中没有生成任何 WHERE 条件,说明 EF Core 不认识我们定义的 UserCodeLike 方法,不知道怎么将 UserCodeLike 方法转换为对应的 SQL 语句,所以干脆就做了全表查询,将 User 表的数据从数据库全查出来后,再调用我们的 UserCodeLike 方法来过滤数据,如果 User 表的数据量非常大,这样效率其实会非常低。所有不建议在 EF Core 的 lambda 表达式中使用自定义函数。

 

lambda函数 python

lambda函数 python

lambda表达式是一行函数。
它们在其他语言中也被称为匿名函数。如果你不想在程序中对一个函数使用两次,你也许会想用lambda表达式,它们和普通的函数完全一样。

原型:lambda 参数:操作(参数)

例子:

>>> add = lambda x,y:x+y
>>> print(add(1,2))
3

lambda还可以在一些特殊情况下使用

1、列表排序

>>> a = [(1,2),(4,1),(9,10),(13,-3)]
>>> a.sort(key=lambda x:x[1])
>>> print(a)
[(13, -3), (4, 1), (1, 2), (9, 10)]
>>> a.sort(key = lambda x:x[0])
>>> print(a)
[(1, 2), (4, 1), (9, 10), (13, -3)]

 

Python - 通过 lambda 函数传递的参数不保留其状态

Python - 通过 lambda 函数传递的参数不保留其状态

您对局部变量所做的任何更改,例如 make_editable_process 中的 _editable,仅在该函数内部可见,因此在外部查看更改,您需要要么返回它,要么将其保存到给定可变对象的函数外部的某个对象中(例如那些各种按钮的东西),或将其声明为 globalnonlocal

对于你的情况,我认为非本地人就足够了。

示例

你正在试验的是这个

>>> def fun():
        a=5
        def f():
            a=42
        print(a)
        f()
        print(a)


>>> fun()
5
5
>>>
a 中的

f 是 f 的局部变量,对它的任何更改仅在内部可见,要在外部更改它,请执行前面提到的任何方法,例如使用 nonlocal:

>>> def fun2():
        a=5
        def f():
            nonlocal a
            a=42
        print(a)
        f()
        print(a)


>>> fun2()
5
42
>>> 
,

对于 True/False、数字、字符串等值,Python 将其值发送给函数(或其他变量)——而不是对变量的引用。

例如:

 a = False 
 _editable = a 
 _editable = True
 print(a) 

a 仍然是 False,而不是 True

tkinter 中,您将为此使用 tkinter.BooleanVar()

 import tkinter as tk

 a = tk.BooleanVar(value=False)
 # a.set(False)
 _editable = a 
 _editable.set(True)
 print(a.get())

当您更改 a

时,现在 _editable 会更改值

记住用.get()取值,用.set()代替=取值。


编辑:

在其他情况下,您必须使用 return 并将结果分配回变量

def function(_editable):
    # ... code ...

    _editable = True

    return _editable

a = False
a = function(a)  # assign returned value to `a`
print(a)

但是当函数被分配给 Button(或在 bind()after() 中)时,它无法获得返回值并分配回变量 - 然后通常我们使用 { {1}} 直接为外部变量赋值

global

关于Python Lambda不接受元组参数python类不接受任何参数的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于2.3.6 Python 匿名函数 lambda、C# 中 Lambda 表达式类型 Expression 不接受 lambda 函数、lambda函数 python、Python - 通过 lambda 函数传递的参数不保留其状态的相关信息,请在本站寻找。

本文标签: