GVKun编程网logo

Python-什么是“第一类”对象?(python中类方法的第一个参数)

27

本篇文章给大家谈谈Python-什么是“第一类”对象?,以及python中类方法的第一个参数的知识点,同时本文还将给你拓展(转)什么是“第一方Cookie”、“第三方Cookie”、java–从集合中

本篇文章给大家谈谈Python-什么是“第一类”对象?,以及python中类方法的第一个参数的知识点,同时本文还将给你拓展(转)什么是“第一方Cookie”、“第三方Cookie”、java – 从集合中删除“第一个”对象、python – Ruby中的第一类函数、Python 为什么会有个奇怪的“...”对象?等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Python-什么是“第一类”对象?(python中类方法的第一个参数)

Python-什么是“第一类”对象?(python中类方法的第一个参数)

在给定的编程语言中,什么时候将对象或其他东西称为“一流”,为什么?它们与没有语言的语言有何不同?

编辑。当一个人说“一切都是对象”时(就像在Python中一样),他的确表示“一切都是一流的”吗?

答案1

小编典典

简而言之,这意味着对对象的使用没有任何限制。它与任何其他对象相同。

第一类对象是可以动态创建,销毁,传递给函数,作为值返回并具有编程语言中其他变量所具有的所有权利的实体。

根据语言,这可能意味着:

  • 可表示为匿名文字值
  • 可存储在变量中
  • 可存储在数据结构中
  • 具有固有身份(独立于任何给定名称)
  • 在与其他实体平等方面具有可比性
  • 可作为参数传递给过程/功能
  • 由于过程/功能可退还
  • 在运行时可构造
  • 可打印
  • 易读
  • 在分布式过程中可传播
  • 在外部运行过程中可存储

但是,在C ++函数中,它们本身不是一流的对象:

  • 你可以覆盖’()’运算符,以使它具有对象函数(第一类)成为可能。
  • 函数指针是一流的。
  • boost bind,lambda和function确实提供了一流的功能
    在C ++中,类不是第一类对象,但是这些类的实例是。在Python中,类和对象都是一流的对象。(有关将类作为对象的更多详细信息,请参见此答案)。

这是Javascript一流函数的示例:

// f: function that takes a number and returns a number// deltaX: small positive number// returns a function that is an approximate derivative of ffunction makeDerivative( f, deltaX ){    var deriv = function(x)    {        return ( f(x + deltaX) - f(x) )/ deltaX;    }    return deriv;}var cos = makeDerivative( Math.sin, 0.000001);// cos(0)     ~> 1// cos(pi/2)  ~> 0

不是第一类对象的实体称为第二类对象。C ++中的函数是第二类,因为它们不能动态创建。

关于编辑:

编辑。当一个人说“一切都是对象”时(就像在Python中一样),他的确表示“一切都是一流的”吗?

术语“对象”可以宽松地使用,并不意味着是一流的。将整个概念称为“一流实体”可能更有意义。但是在Python中,它们的目标是使所有东西都达到一流。我相信发表你讲话的人的意图是一流的。

(转)什么是“第一方Cookie”、“第三方Cookie”

(转)什么是“第一方Cookie”、“第三方Cookie”

在了解什么是“第一方Cookies”、“第三方Cookies”之前,我们应该先了解一下,什么叫Cookie?

 

什么叫Cookie?

Cookie是网站存放在客户端的一小段数据。一般的,网站为了提升用户体验,在客户的客户端中保存用户的历史信息,以备用户再次访问时网站能提供 更方便,更有针对性的服务。比如,网站可以记住你的登录状态,只要登录一次下次访问就不用在登录;购物网能记住你浏览过的产品,保留你购物车中的物品。这些都有Cookie的功劳。

Cookie是如何工作的?

比如,我们访问一个网站,来到了登录的页面。页面需要我们输入用户名和密码,同时下面有一个选项,叫“保留我的登录状态”,如果输入了用户名,密 码。为了下次在来这个网站,不用再重新输入,我们激活了保留状态的选项。最后点了提交。这时,我们的浏览器就会和网站服务器之间通过HTTP协议进行链 接,提交刚才输入的内容和选择。服务器收到以后,会判断这个用户名密码是否正确,因为我们需要保留状态,就需要设置Cookie来记录状态。那服务器会在 返回的HTTP数据包的头部包含SetCookie这个指令来告诉浏览器要保存的Cookie。浏览器收到以后会把这个Cookie加密存储到电脑上。这 个Cookie记录的一般是用户在这个网站的唯一的ID。之后,只要每次访问这个网站(只要还是这个域名),我们的浏览器在请求这个网站服务器数据的时 候,都会在HTTP请求数据包的头部增加一条包含Cookie数据的信息,比如这里会告诉服务器:“我是你的用户,我的ID是9527。”那服务器收到这 个信息,就不会再提示登录,而我们就已经是登录的状态了。

Cookie的生命周期

Cookie的生命周期有两种,一种是整个会话的,一种是永久  的。也就是说,一种是临时性的Cookie,用户关掉浏览器,这个Cookie也就失效了。一种是永久的Cookie,可以持续存在的。一般网站分析工具 判断Unique Visitor使用的是后者。

所谓“第一方Cookie”,指的是来自当前正在访问的网站,储存了一定信息的Cookie;所谓“第三方Cookie”,指的是来自当前访问网站以外的站点,最常见的就是那些在被访问站点放置广告的第三方站点,这第三方站点可能正在使用Cookie;所谓“会话Cookie”,就是当前浏览时存储的一些信息,在关闭IE的同时,这些Cookie也同时被删除,它一般没什么危害。

第一方和第三方Cookie的区别

第一方Cookie和第三方Cookie,都是网站在客户端上存放的一小块数据。他们都由某个域存放,只能被这个域访问。他们的区别其实并不是技术 上的区别,而是使用方式上的区别。比如,访问www.a.com这个网站,这个网站设置了一个Cookie,这个Cookie也只能被www.a.com 这个域下的网页读取,这就是第一方Cookie。如果还是访问www.a.com这个网站,网页里有用到www.b.com网站的一张图片,浏览器在 www.b.com请求图片的时候,www.b.com设置了一个Cookie,那这个Cookie只能被www.b.com这个域访问,反而不能被 www.a.com这个域访问,因为对我们来说,我们实际是在访问www.a.com这个网站被设置了一个www.b.com这个域下的Cookie,所 以叫第三方Cookie。
上面这么多看完还没有绕晕的请继续。


第一方Cookie的优势和应用

第一方Cookie的最大优势是接受率高。一般主流的浏览器的都会有隐私的设置,可以让用户设置是否接受Cookie,接受哪些Cookie。除了 完全不接受Cookie这个设置以外,其他情况下,第一方Cookie都是会被用户接受的(不接受的话,是没办法把那小块数据保存下来的)。所以,如果没 有特殊要求,使用第一方Cookie会比第三方Cookie,我们通过分析工具得到的数据会更准确。


第三方Cookie的优势和应用

第三方Cookie的接受率不如第一方Cookie(不过主流的浏览器默认的设置下也接受带P3P协议的第三方Cookie,我的经验是接受率能达 到90%,甚至95%以上),但在某些特定情况下可以实现第一方Cookie无法实现的功能。比如,当我们有多个域名的网站需要跟踪,我们希望了解到用户 点击某个广告到达域名A下的网页,然后可能浏览了不论那个域名下的页面,最后在域名B下的网页完成注册的情况。广告可以在域名A下的网页被跟踪到,而注册 可以在域名B下的网页跟踪到。如果我们使用第一方Cookie,会为域名A建立一个Cookie,为域名B再建立一个Cookie,他们可以关联各自域名 下网页上的行为,但是无法关联起来。而使用第三方Cookie,那么无论多少个域,都只有一个Cookie,一个属于第三方域的Cookie,网站下所有 域都能共享这个Cookie,那么所有的行为都能被关联起来分析。

其实大部分的浏览器都会支持跨域Cookie的,现在的门户网站,等其他网站里面都是前套着不同的域加载而形成的数据。

但是记录数据的时候,会同时产生多条记录,一个网站下,每一个域一条记录。这样就需要清洗数据了。

网站分析是以数据为基础的,而数据的采集需要借助网站 分析工具。主流的网站分析工具主要分两种类型:日志型和页面脚本型。这两种类型工具的一个区别就在于对Unique  Visitor的区分很判断。当网站有很多次访问的记录的时候,如何判断那些访问来至同一个用户。日志型的分析工具,一般通过访问的来源IP地址进行判 断,通过相同IP地址的访问被认为来至同一个用户。页面脚本型的分析工具,就需要根据Cookie的记录来判断不同的访问是否来至不同的用户。这类的工具 会在Cookie中存放用来标识唯一用户的ID,每个浏览器得到的ID都是不同的。用户访问时检查Cookie中的ID,ID相同的访问被认为来至同一个 用户,否则,则是不同用户的访问。

Unique Visitor的判断对于网站分析来说非常重要,以致于分析工具在Cookie中存储的其他信息都显得不那么重要了。Unique  Visitor并不仅仅是一个Metric,更重要的是,Unique  Visitor把跨越多次访问的事件联系在一起。想象一下,一个访客通过一个广告来到网站,在这次访问离开前没有进行任何购买,但有把网站的网址加入到书 签。过了几天,这个访客通过点击书签,又访问了我们的网站,最后购买了一些商品。这时,如果没有Unique  Visitor来关联,那点击广告和购买商品的行为是没有任何关联的,我们无法知道访客点击的广告为最后的购买所做的贡献。可见,Cookie对网站分析 是多么重要,通过Cookie,才能将多次访问中的事件串联起来。

总结:对于通过脚本型的网站分析工具来获取数据

Cookie是必须的,离开Cookie我们什么也分析不了。
第一方Cookie接受率高,更准确,没有特殊需要就用他。
第三方Cookie可以跨域跟踪,特别需求可以应用。

java – 从集合中删除“第一个”对象

java – 从集合中删除“第一个”对象

在某些情况下,我需要驱逐 Java集合中最早的元素.该集合使用 LinkedHashSet实现,这使得简单:只是摆脱集合迭代器返回的第一个元素:
Set<Foo> mySet = new LinkedHashSet<Foo>();
// do stuff...
if (mySet.size() >= MAX_SET_SIZE)
{
    Iterator<Foo> iter = mySet.iterator();
    iter.next();
    iter.remove();
}

这是丑陋的:3行做一些我可以做的1行,如果我使用SortedSet(由于其他原因,SortedSet不是一个选项)

if (/*stuff*/)
{
    mySet.remove(mySet.first());
}

那么有没有更清洁的方法呢?

>改变Set的实现,或者
写一个静态的实用方法?

使用Guava的任何解决方案都是可以的.

我完全知道集合没有固有的顺序.我要求删除由迭代顺序定义的第一个条目.

解决方法

LinkedHashSet是LinkedHashMap的包装器,它支持简单的“删除最旧”策略.使用它作为一套你可以做
Set<String> set = Collections.newSetFromMap(new LinkedHashMap<String,Boolean>(){
    protected boolean removeEldestEntry(Map.Entry<String,Boolean> eldest) {
        return size() > MAX_ENTRIES;
    }
});

python – Ruby中的第一类函数

python – Ruby中的第一类函数

我正在通过这篇关于函数式编程的文章(https://codewords.recurse.com/issues/one/an-introduction-to-functional-programming)并试图用Ruby做练习.

一个练习定义了两个函数,零和一个. Zero接受一个字符串参数并返回字符串索引1 – 如果第一个字符为0则结束,One执行相同的操作但仅当第一个字符为1时.

以下是ruby实现:

def zero(s)
  if s[0] == "0"
    return s[1..(s.length)]
  end
end

def one(s)
  if s[0] == "1"
    return s[1..(s.length)]
  end
end

问题要求你编写一个名为rule_sequence的方法,给定一个字符串和一个函数数组,返回结果,以便一次调用一个函数 – 第一个函数在整个字符串中被调用,第二个函数被调用关于该字符串的返回值等.如果在任何时候,其中一个函数返回nil,则返回nil.

Python实现是:

def rule_sequence(s, rules):
    if s == None or not rules:
        return s
    else:
        return rule_sequence(rules[0](s), rules[1:])

但是,由于Ruby似乎不支持高阶函数,我能想出的最优雅的解决方案如下:

def rule_sequence(string, rules)
  if rules.length == 0 or string.nil?
    return string
  else
    return rule_sequence(rules[0].call(string), rules[1..rules.length])
  end
end

puts rule_sequence('0101', [lambda { |s| zero(s) }, lambda { |s| one(s) }, lambda { |s| zero(s) } ])

任何人都可以提出比传递或调用lambdas更简洁的东西吗?

解决方法:

我将以此练习为契机,展示Ruby如何支持更高阶的函数.

让我们退后一步,重写零 – 一个功能.
你可以注意到他们有很多共同之处.
让我们尝试通过编写一个可以生成两者的lambda来利用它

tail_on_prefix = lambda {|prefix|
  lambda {|str| str[1..-1] if str[0] == prefix}
}

我们现在可以轻松定义零和一

zero = tail_on_prefix.("0")
one = tail_on_prefix.("1")

到rule_sequence吧!

rule_sequence = lambda {|str, rules|
  if (str.nil? or rules.empty?)
    str
  else
    rule_sequence.(rules[0].(str), rules[1..-1])
  end
}

现在调用rule_sequence看起来好一点,不是吗

rule_sequence.("100101", [one, zero, zero]) # => "101"

Python 为什么会有个奇怪的“...”对象?

Python 为什么会有个奇怪的“...”对象?

  Python猫 ” ,一个值得加星标的 公众号

本文出自“Python为什么”系列,请查看全部文章

在写上一篇《Python 为什么要有 pass 语句?》时,我想到一种特别的写法,很多人会把它当成 pass 语句的替代。在文章发布后,果然有三条留言提及了它。

所谓特别的写法就是下面这个:

# 用 ... 替代 pass
def foo():
 ...

它是中文标点符号的半个省略号,也即由英文的 3 个点组成。如果你是第一次看到,很可能会觉得奇怪:这玩意是怎么回事?PS:如果你知道它,仔细看过本文后,你同样可能会觉得奇怪!

1、认识一下“...”内置常量

事实上,它是 Python 3 中的一个内置对象,有个正式的名字叫作——Ellipsis,翻译成中文就是“省略号”。

更准确地说,它是一个内置常量(Built-in Constant),是 6 大内置常量之一(另外几个是 None、False、True、NotImplemented、__debug__)。

关于这个对象的基础性质,下面给出了一张截图,你们应该能明白我的意思:

“...“并不神秘,它只是一个可能不多见的符号型对象而已。用它替换 pass,在语法上并不会报错,因为 Python 允许一个对象不被赋值引用。

严格来说, 这是旁门左道,在语义上站不住脚——把“...”或其它常量或已被赋值的变量放在一个空的缩进代码块中,它们是与动作无关的,只能表达出“这有个没用的对象,不用管它”。

Python 允许这些不被实际使用的对象存在,然而聪明的 IDE 应该会有所提示(我用的是Pycharm),比如告诉你Statement seems to have no effect

但是“...”这个常量似乎受到了特殊对待,我的 IDE 上没有作提示。

很多人已经习惯上把它当成 pass 那样的空操作来用了(在最早引入它的邮件组讨论中,就是举了这种用法的例子)。但我本人还是倾向于使用 pass,不知道你是怎么想的呢?

2、奇怪的 Ellipsis 和 ...

... 在 PEP-3100 中被引入,最早合入在 Python 3.0 版本,而 Ellipsis 则在更早的版本中就已包含。

虽然官方说它们是同一个对象的两种写法,而且说成是单例的(singleton),但我还发现一个非常奇怪的现象,与文档的描述是冲突的:

如你所见,赋值给 ... 时会报错SyntaxError: cannot assign to Ellipsis ,然而 Ellipsis 却可以被赋值,它们的行为根本就不同嘛!被赋值之后,Ellipsis 的内存地址以及类型属性都改变了,它成了一个“变量”,不再是常量。

作为对比,给 True 或 None 之类的常量赋值时,会报错SyntaxError: cannot assign to XXX,但是给 NotImplemented 常量赋值时不会报错。

众所周知,在 Python 2 中也可以给布尔对象(True/False)赋值,然而 Python 3 已经把它们改造成不可修改的。

所以有一种可能的解释:Ellipsis 和 NotImplemented 是 Python 2 时代的遗留产物,为了兼容性或者只是因为核心开发者遗漏了,所以它们在当前版本(3.8)中还可以被赋值修改。

... 出生在 Python 3 的时代,或许在将来会完全取代 Ellipsis。目前两者共存,它们不一致的行为值得我们注意。我的建议:只使用"..."吧,就当 Ellipsis 已经被淘汰了。

3、为什么要使用“...”对象?

接下来,让我们回到标题的问题:Python 为什么要使用“...”对象?

这里就只聚焦于 Python 3 的“...”了,不去追溯 Ellipsis 的历史和现状。

之所以会问这个问题,我的意图是想知道:它有什么用处,能够解决什么问题?从而窥探到 Python 语言设计中的更多细节。

大概有如下的几种答案:

(1)扩展切片语法

官方文档中给出了这样的说明:

Special value used mostly in conjunction with extended slicing syntax for user-defined container data types.

这是个特殊的值,通常跟扩展的切片语法相结合,用在自定义的数据类型容器上。

文档中没有给出具体实现的例子,但用它结合__getitem__() 和 slice() 内置函数,可以实现类似于 [1, ..., 7] 取出 7 个数字的切片片段的效果。

由于它主要用在数据操作上,可能大部分人很少接触。听说 Numpy 把它用在了一些语法糖用法上,如果你在用 Numpy 的话,可以探索一下都有哪些玩法?

(2)表达“未完成的代码”语义

... 可以被用作占位符,也就是我在《Python 为什么要有 pass 语句?》中提到 pass 的作用。前文中对此已有部分分析。

有人觉得这样很 cute,这种想法获得了 Python 之父 Guido 的支持 :

(3)Type Hint 用法

Python 3.5 引入的 Type Hint 是“...”的主要使用场合。

它可以表示不定长的参数,比如Tuple[int, ...] 表示一个元组,其元素是 int 类型,但数量不限。

它还可以表示不确定的变量类型,比如文档中给出的这个例子:

from typing import TypeVar, Generic

T = TypeVar(''T'')

def fun_1(x: T) -> T: ...  # T here
def fun_2(x: T) -> T: ...  # and here could be different

fun_1(1)                   # This is OK, T is inferred to be int
fun_2(''a'')                 # This is also OK, now T is str

T 在函数定义时无法确定,当函数被调用时,T 的实际类型才被确定。

在 .pyi 格式的文件中,... 随处可见。这是一种存根文件(stub file),主要用于存放 Python 模块的类型提示信息,给 mypy、pytype 之类的类型检查工具 以及 IDE 来作静态代码检查。

(4)表示无限循环

最后,我认为有一个非常终极的原因,除了引入“...”来表示,没有更好的方法。

先看看两个例子:

两个例子的结果中都出现了“...”,它表示的是什么东西呢?

对于列表和字典这样的容器,如果其内部元素是可变对象的话,则存储的是对可变对象的引用。那么,当其内部元素又引用容器自身时,就会递归地出现无限循环引用。

无限循环是无法穷尽地表示出来的,Python 中用 ... 来表示,比较形象易懂,除了它,恐怕没有更好的选择。

最后,我们来总结一下本文的内容:

  • ... 是 Python 3 中的一个内置常量,它是一个单例对象,虽然是 Python 2 中就有的 Ellipsis 的别称,但它的性质已经跟旧对象分道扬镳
  • ... 可以替代 pass 语句作为占位符使用,但是它作为一个常量对象,在占位符语义上并不严谨。很多人已经在习惯上接受它了,不妨一用
  • ... 在 Python 中不少的使用场景,除了占位符用法,还可以支持扩展切片语法、丰富 Type Hint 类型检查,以及表示容器对象的无限循环
  • ... 对大多数人来说,可能并不多见(有人还可能因为它是一种符号特例而排斥它),但它的存在,有些时候能够带来便利。希望本文能让更多人认识它,那么文章的目的也就达成了~

如果你觉得本文分析得不错,那你应该会喜欢这些文章:

1、Python为什么使用缩进来划分代码块?

2、Python 的缩进是不是反人类的设计?

3、Python 为什么不用分号作语句终止符?

4、Python 为什么没有 main 函数?为什么我不推荐写 main 函数?

5、Python 为什么推荐蛇形命名法?

6、Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?

7、Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?

8、Python 为什么用 # 号作注释符?

9、Python 为什么要有 pass 语句?

本文属于“Python为什么”系列(Python猫出品),该系列主要关注 Python 的语法、设计和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。所有文章将会归档在 Github 上,项目地址:https://github.com/chinesehuazhou/python-whydo

优质文章,推荐阅读:

C++ 模板沉思录(上)

编程语言之问:何时该借用,何时该创造?

深入探讨 Python 的 import 机制:实现远程导入模块

不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?

本文分享自微信公众号 - Python猫(python_cat)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

关于Python-什么是“第一类”对象?python中类方法的第一个参数的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于(转)什么是“第一方Cookie”、“第三方Cookie”、java – 从集合中删除“第一个”对象、python – Ruby中的第一类函数、Python 为什么会有个奇怪的“...”对象?等相关内容,可以在本站寻找。

本文标签:

上一篇如何为整个屏幕设置OnTouchListener?(屏幕设置overdrive)

下一篇faces-config.xml中的注释与托管bean声明