在这里,我们将给大家分享关于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类不接受任何参数)
- 2.3.6 Python 匿名函数 lambda
- C# 中 Lambda 表达式类型 Expression 不接受 lambda 函数
- lambda函数 python
- Python - 通过 lambda 函数传递的参数不保留其状态
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
#例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 函数
在 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
表达式是一行函数。
它们在其他语言中也被称为匿名函数。如果你不想在程序中对一个函数使用两次,你也许会想用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 函数传递的参数不保留其状态
您对局部变量所做的任何更改,例如 make_editable_process 中的 _editable,仅在该函数内部可见,因此在外部查看更改,您需要要么返回它,要么将其保存到给定可变对象的函数外部的某个对象中(例如那些各种按钮的东西),或将其声明为 global
或 nonlocal
对于你的情况,我认为非本地人就足够了。
示例
你正在试验的是这个
>>> 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 函数传递的参数不保留其状态的相关信息,请在本站寻找。
本文标签: