php怎么获取父类的常量,华为软件工程师的面试题是?
华为,世界500强排名第315位,每年都会通过校园招聘入职很多应届毕业生。华为的高薪水一直是在行业内比较有名的。据网上相关消息透露,华为的薪资水平大约是应届本科9K、研究生10K、博士12-14K左右。对于大学生求职者而言,华为是个很不错的选择,平台大、工作环境有活力、敢于对新人委以重任、考勤晋升福利等规章制度清晰明确。
据中公教育快就业(大学生就业求职服务机构)了解,华为每年一般都会在各大高校打响校园招聘求职季的第一炮。华为的校园招聘时间,根据2016年的情况应该是在9月份。9月初宣讲会、9月末面试。想要进华为的同学,首先要及时关注各类华为的官网以及各大招聘网站相关信息,同时也要提前准备好个人简历,其次,华为的面试真题、面试经验以及大学生必须了解的面试技巧等方面也要尽早做功课。
华为实习客户经理面试题
1.自我介绍。
2.说说你的学校和你的家乡。
3.为什么选择华为?
4.对华为的了解。
5.对于客户经理岗位的认识。
6.有认识的人在华为么?
7.有没有女朋友?
8.为什么跟前女友分手?
华为android工程师面试题
1.说下项目中怎么实现线程间通信的?Handler机制和AsyncTask
2.项目中怎么测试的?
3.用没用过压力测试monkey
4.说下android的内训泄露
华为财务面试题
1. 递延所得税的账务处理。
2.税收筹划怎么进行?
3.融资租赁了解多少?
华为java实习生面试题
1、写一个自己实现strcpy这个函数的实现
2、请谈谈你的家庭情况
3、请谈谈你的职业规划
4、为什么选择华为而不是bat?
以上华为面试题由中公教育快就业搜集整理,转载请注明出处。
python函数头是什么?
本文主要以python2为例。首先介绍一下Python头文件的编程风格,然后再给大家详细介绍import部分的基本用法。这两个部分就是python中头文件的组成模块。
编程风格#!/usr/bin/env python #在文件头部 ( 第一行 ) 加上 设置 Python 解释器
# -*coding: utf-8 -* #在文件头部 ( 第二行 ) 加上 在编辑器中设置以 UTF-8 默认编码保存文件
# Copyright (c) *** #版权信息放在文件头部,文件编码之后
# docstring 是Python特有的注释风格,它是模块、类或函数的第一个语句,可以通过__doc__方法访问
# 用英语撰写注释,短注释可以忽略末尾的句号 (.)
# docstring 为每个模块、类或函数撰写
docstring 推荐使用三个双引号(”””) 来定义
docsting , 不推荐使用三个单引号 (''') # 模块的 docsting 放在文件头部,版权信息之后
”””This is a one line docstring.”””
”””The title of a multiline docstring: After title is the content.You can write it as long
as needed. ””” # 把 import 语句放在文件头部,在模块 docstring 之后,在模块全局变量或全局常量之前
# 按照从一般到特殊的原则分组
import 语句,先 import 标准库,然后 import 第三方库,最后 import 程序中的自定义库
# 在不同分组的 import 语句之间加空行 # 每个 import 语句只导入一个模块
import sys
import time
from PyQt.QtCore import SIGNAL, QTimer # 在终端中使用中文字符 在文件头部加上
# import sys
# reload(sys)
# sys.setdefaultencoding('utf-8')
import
1、系统库的应用
这里说的系统库,一般是指python软件自带的库,不是从第三方安装的库。比如说,如果import sys了,会怎么打印。>>> import sys
>>> print sys
这说明sys库很有可能就是嵌入在python里面的,根本没有办法删除。那是不是所有的库都是这样呢,我们可以找os试一试:>>> import os
>>> print os
很明显,这里的os库是由pyc提供的,所以从优先级来说,似乎sys还要更重要一些。
2、第三方库
所谓第三方库,就是通过python setup.py install安装、pip安装或者通过apt-get install安装的库。这类库很多,我自己常用的就有webpy、twisted、cv2、sklearn、wxpython,这些lib无一例外,都是以pyc的形式存在的。比如说,我们看一下webpy:>>> import web
>>> print web
3、本地目录文件引用
如果是本地文件引用,其实方法也很简单,直接import一下就可以了。如果import成功,python就会生成对应文件的pyc文件。比如说,exer1.py想引用一下exer2.py中的函数,那么它可以这么做:import exer2
或者是from exer2 import *
其次,要注意的是,这种方法不光适用于python,也适用于动态库文件。我们知道,有的时候为了扩展python功能,需要写c文件生成动态库供python使用。有兴趣的同学可以参考这个链接。这个时候,如果需要引用动态库文件,直接import文件名就可以了。
4、引用子目录文件
除了同级目录引用之外,另外用的比较多的就是子目录引用。比如说,exer1.py和sub目录在一个文件夹下面,如果exer1.py想引用sub下面的exer2.py,那么它应该怎么做呢?这个时候,一定要保证sub目录下有__init__.py文件。from sub import exer2
或者是,from sub.exer2 import *
5、子目录引用父目录
有的时候,子目录为了使用父目录或者其他目录(类似util目录)的一些功能,常常要反向引用。这个时候,sys库就派上了用场。假设exer1.py和sub目录在同一级,sub目录下有一个exer2.py文件,这个时候exer2.py想引用exer1.py的功能,那么它可以这么操作:import sys
sys.path.append('../')
import exer1
或者是,import sys
sys.path.append('../')
from exer1 import *
6、交叉引用
如果有两个文件交叉引用,这个时候我建议可以保留一个文件的引用,另外一个文件的引用可以放到函数下面来做,比如说像这样:def process():
import exer1
exer1.add()
7、import文件的顺序建议
关于python下import文件的顺序,我个人的经验是这样安排比较好。
有什么关于万物守恒的电影?
《前目的地》
《前目的地》是迈克尔·斯派瑞、彼得·斯派瑞兄弟联袂编剧并执导的一部科幻惊悚片,由伊桑·霍克、莎拉·斯努克、诺亚·泰勒、弗雷娅·斯塔福、伊莉斯·詹森主演。
根据1959年的科幻小说《你们这些回魂尸》改编,原作仅仅万字却设定吊炸天,内容令人惊叹!
一位时空劳工局特工奉命穿越时空,试图阻止连环爆炸犯“炸弹客”再次犯下大案。
但最终任务失败,他被炸弹毁容,不得不接受整容手术,以新面容示人。
他退休前的最后一个任务就是回到1970年的一个酒吧,将一个名叫约翰的男人带到未来成为他的接班人。
他和约翰一见如故,约翰向他讲诉了自己如何从一个女孩到最后变性成为一个男人的辛酸故事。
当年约翰曾是名叫简的女孩,无父无母孤苦伶仃从小在孤儿院长大。
她不擅长人际关系,性情也有点性格古怪。
成年后的简为了离开孤儿院,参加了太空公司人员选拔,最终因为与队友打架被开除。
1963年简又重新回到大学读书,并遇上了一个改变她一生的男人——简迅速坠入爱河并怀孕。
但幸福是短暂的,这个男人最终抛弃了她,并消失不见。
1964年,简在医院生产时,医生发现她是双性人,拥有两套生殖系统。
但不幸的的是,由于生产大出血,她的女性生殖系统受损严重不能再使用。
医生不得不为她做变形手术,由女性变为男性。
同时,简的女儿在医院莫名被抢,双重打击下的简麻木的接受着一切,改名约翰,用男人的身份生活至今。
特工决定带约翰穿越时空回到过去复仇,杀死那个男人,但前提是约翰必须接替自己。
到此时你才发现——简当年遇到的男人是约翰,也就是未来变成男人的简。
特工在1963年约翰和简恋爱期间,穿越时空来到到1964年,偷走了简的女儿,并将她带到1945年,遗弃在孤儿院门口。
特工又回到1963年,带走了约翰,并将他带到了1985年,成为了继任特空,自己退休。
特工退休后来到1975年的纽约,他发现了炸弹客遗留下的线索并找到了他,发现竟然是年老的自己。
为了避免伤害更多无辜平民,特工杀了炸弹客,也就是他自己。
成为特工的约翰在1912年奉命拆除一个炸弹,却被炸弹客偷袭而毁容。
整容过后的他,却和招募他的特工一模一样。
而他收到的退休前的最后一个任务,同样是回到1970年去招募约翰。
直到最后你才发现编剧脑洞如此大。
原来他们利用时空机穿越时空,将不同时空的自己穿插到了一起。
所以无论是婴儿时期,还是简,男约翰,再到烧伤的特工,整容后的特工,炸弹客,他们都是同一个人。
这是一部讲宿命论的莫比乌斯环似的循环电影。
男主的人生构成了一个“闭环”。
无论从哪里开始都是开始,从哪里结束都是结束,一直如宿命般往复不止,男主永远无法逃出这命运死循环。
情节紧凑,故事烧脑,演技给力,值得一看。
如何评价GO语言?
Go语言,作为编程语言的后生,站在巨人的肩膀上,吸收了其他一些编程语言的特点。
以下内容摘自官方网站:
Go 编程语言是一个开源项目,它使程序员更具生产力。Go 语言具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制, 用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。 Go 代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。 它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。一、思想
Less can be more
大道至简,小而蕴真
让事情变得复杂很容易,让事情变得简单才难
深刻的工程文化
二、核心特性
Go语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题。这里我们并不会深入讨论GO语言的具体语法,只会将语言中关键的、对简化编程具有重要意义的方面介绍给大家,体验Go的核心特性。
2.1 并发编程
Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是其最大亮点之一,也是其在未来进入高并发高性能场景的重要筹码。
不同于传统的多进程或多线程,golang的并发执行单元是一种称为goroutine的协程。由于在共享数据场景中会用到锁,再加上GC,其并发性能有时不如异步复用IO模型,因此相对于大多数语言来说,golang的并发编程简单比并发性能更具卖点。在当今这个多核时代,并发编程的意义不言而喻。当然,很多语言都支持多线程、多进程编程,但遗憾的是,实现和控制起来并不是那么令人感觉轻松和愉悦。Golang不同的是,语言级别支持协程(goroutine)并发(协程又称微线程,比线程更轻量、开销更小,性能更高),操作起来非常简单,语言级别提供关键字(go)用于启动协程,并且在同一台机器上可以启动成千上万个协程。协程经常被理解为轻量级线程,一个线程可以包含多个协程,共享堆不共享栈。协程间一般由应用程序显式实现调度,上下文切换无需下到内核层,高效不少。
协程间一般不做同步通讯,而golang中实现协程间通讯有两种:
共享内存型,即使用全局变量+mutex锁来实现数据共享;
消息传递型,即使用一种独有的channel机制进行异步通讯。
对比JAVA的多线程和GO的协程实现,明显更直接、简单。这就是GO的魅力所在,以简单、高效的方式解决问题,关键字go,或许就是GO语言最重要的标志。
高并发是Golang语言最大的亮点。
2.2 内存回收(GC)
从C到C++,从程序性能的角度来考虑,这两种语言允许程序员自己管理内存,包括内存的申请和释放等。因为没有垃圾回收机制所以C/C++运行起来速度很快,但是随着而来的是程序员对内存使用上的很谨小慎微的考虑。因为哪怕一点不小心就可能会导致“内存泄露”使得资源浪费或者“野指针”使得程序崩溃等,尽管C++11后来使用了智能指针的概念,但是程序员仍然需要很小心的使用。后来为了提高程序开发的速度以及程序的健壮性,java和C#等高级语言引入了GC机制,即程序员不需要再考虑内存的回收等,而是由语言特性提供垃圾回收器来回收内存。但是随之而来的可能是程序运行效率的降低。
GC过程是:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时起一个专门gorountine回收内存到空闲list中以备复用,不物理释放。物理释放由专门线程定期来执行。
GC瓶颈在于每次都要扫描所有对象来判活,待收集的对象数目越多,速度越慢。一个经验值是扫描10w个对象需要花费1ms,所以尽量使用对象少的方案,比如我们同时考虑链表、map、slice、数组来进行存储,链表和map每个元素都是一个对象,而slice或数组是一个对象,因此slice或数组有利于GC。
GC性能可能随着版本不断更新会不断优化,这块没仔细调研,团队中有HotSpot开发者,应该会借鉴jvm gc的设计思想,比如分代回收、safepoint等。
内存自动回收,再也不需要开发人员管理内存
开发人员专注业务实现,降低了心智负担
只需要new分配内存,不需要释放
2.3 内存分配
初始化阶段直接分配一块大内存区域,大内存被切分成各个大小等级的块,放入不同的空闲list中,对象分配空间时从空闲list中取出大小合适的内存块。内存回收时,会把不用的内存重放回空闲list。空闲内存会按照一定策略合并,以减少碎片。
2.4 编译
编译涉及到两个问题:编译速度和依赖管理
目前Golang具有两种编译器,一种是建立在GCC基础上的Gccgo,另外一种是分别针对64位x64和32位x86计算机的一套编译器(6g和8g)。
依赖管理方面,由于golang绝大多数第三方开源库都在github上,在代码的import中加上对应的github路径就可以使用了,库会默认下载到工程的pkg目录下。另外,编译时会默认检查代码中所有实体的使用情况,凡是没使用到的package或变量,都会编译不通过。这是golang挺严谨的一面。
2.5 网络编程
由于golang诞生在互联网时代,因此它天生具备了去中心化、分布式等特性,具体表现之一就是提供了丰富便捷的网络编程接口,比如socket用net.Dial(基于tcp/udp,封装了传统的connect、listen、accept等接口)、http用http.Get/Post()、rpc用client.Call('class_name.method_name', args, &reply),等等。
2.6 函数多返回值
在C,C++中,包括其他的一些高级语言是不支持多个函数返回值的。但是这项功能又确实是需要的,所以在C语言中一般通过将返回值定义成一个结构体,或者通过函数的参数引用的形式进行返回。而在Go语言中,作为一种新型的语言,目标定位为强大的语言当然不能放弃对这一需求的满足,所以支持函数多返回值是必须的。
函数定义时可以在入参后面再加(a,b,c),表示将有3个返回值a、b、c。这个特性在很多语言都有,比如python。
这个语法糖特性是有现实意义的,比如我们经常会要求接口返回一个三元组(errno,errmsg,data),在大多数只允许一个返回值的语言中,我们只能将三元组放入一个map或数组中返回,接收方还要写代码来检查返回值中包含了三元组,如果允许多返回值,则直接在函数定义层面上就做了强制,使代码更简洁安全。
2.7 语言交互性
语言交互性指的是本语言是否能和其他语言交互,比如可以调用其他语言编译的库。
在Go语言中直接重用了大部份的C模块,这里称为Cgo.Cgo允许开发者混合编写C语言代码,然后Cgo工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。开发者基本上可以完全忽略这个Go语言和C语言的边界是如何跨越的。
golang可以和C程序交互,但不能和C++交互。可以有两种替代方案:1)先将c++编译成动态库,再由go调用一段c代码,c代码通过dlfcn库动态调用动态库(记得export LD_LIBRARY_PATH);2)使用swig(没玩过)
2.8 异常处理
golang不支持try...catch这样的结构化的异常解决方式,因为觉得会增加代码量,且会被滥用,不管多小的异常都抛出。golang提倡的异常处理方式是:
普通异常:被调用方返回error对象,调用方判断error对象。
严重异常:指的是中断性panic(比如除0),使用defer...recover...panic机制来捕获处理。严重异常一般由golang内部自动抛出,不需要用户主动抛出,避免传统try...catch写得到处都是的情况。当然,用户也可以使用panic('xxxx')主动抛出,只是这样就使这一套机制退化成结构化异常机制了。
2.9 其他一些有趣的特性
类型定义:支持var abc = 10这样的语法,让golang看上去有点像动态类型语言,但golang实际上时强类型的,前面的定义会被自动推导出是int类型。
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
简单来说,Go是一门写起来像动态语言,有着动态语言开发效率的静态语言。
一个类型只要实现了某个interface的所有方法,即可实现该interface,无需显式去继承。
Go编程规范推荐每个Interface只提供一到两个的方法。这样使得每个接口的目的非常清晰。另外Go的隐式推导也使得我们组织程序架构的时候更加灵活。在写JAVA/C++程序的时候,我们一开始就需要把父类/子类/接口设计好,因为一旦后面有变更,修改起来会非常痛苦。而Go不一样,当你在实现的过程中发现某些方法可以抽象成接口的时候,你直接定义好这个接口就OK了,其他代码不需要做任何修改,编译器的自动推导会帮你做好一切。
不能循环引用:
即如果a.go中import了b,则b.go要是import a会报import cycle not allowed。好处是可以避免一些潜在的编程危险,比如a中的func1()调用了b中的func2(),如果func2()也能调用func1(),将会导致无限循环调用下去。
defer机制:
在Go语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行。这种机制非常适合善后逻辑处理,比如可以尽早避免可能出现的资源泄漏问题。
【划重点】可以说,defer是继goroutine和channel之后的另一个非常重要、实用的语言特性,对defer的引入,在很大程度上可以简化编程,并且在语言描述上显得更为自然,极大的增强了代码的可读性。
“包”的概念:
和python一样,把相同功能的代码放到一个目录,称之为包。包可以被其他包引用。main包是用来生成可执行文件,每个程序只有一个main包。包的主要用途是提高代码的可复用性。通过package可以引入其他包。
编程规范:
GO语言的编程规范强制集成在语言中,比如明确规定花括号摆放位置,强制要求一行一句,不允许导入没有使用的包,不允许定义没有使用的变量,提供gofmt工具强制格式化代码等等。奇怪的是,这些也引起了很多程序员的不满,有人发表GO语言的XX条罪状,里面就不乏对编程规范的指责。要知道,从工程管理的角度,任何一个开发团队都会对特定语言制定特定的编程规范,特别像Google这样的公司,更是如此。GO的设计者们认为,与其将规范写在文档里,还不如强制集成在语言里,这样更直接,更有利用团队协作和工程管理。
交叉编译:
比如说你可以在运行 Linux 系统的计算机上开发运行 Windows 下运行的应用程序。这是第一门完全支持 UTF-8 的编程语言,这不仅体现在它可以处理使用 UTF-8 编码的字符串,就连它的源码文件格式都是使用的 UTF-8 编码。Go 语言做到了真正的国际化!
三、功能
此处我们说个小段子:
很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己。然后在2009年,go语言诞生。以下就是这些大牛所罗列出的Go要有的功能:
规范的语法(不需要符号表来解析)
垃圾回收(独有)
无头文件
明确的依赖
无循环依赖
常量只能是数字
int和int32是两种类型
字母大小写设置可见性(letter case sets visibility)
任何类型(type)都有方法(不是类型)
没有子类型继承(不是子类)
包级别初始化以及明确的初始化顺序
文件被编译到一个包里
包package-level globals presented in any order
没有数值类型转换(常量起辅助作用)
接口隐式实现(没有“implement”声明)
嵌入(不会提升到超类)
方法按照函数声明(没有特别的位置要求)
方法即函数
接口只有方法(没有数据)
方法通过名字匹配(而非类型)
没有构造函数和析构函数
postincrement(如++i)是状态,不是表达式
没有preincrement(i++)和predecrement
赋值不是表达式
明确赋值和函数调用中的计算顺序(没有“sequence point”)
没有指针运算
内存一直以零值初始化
局部变量取值合法
方法中没有“this”
分段的堆栈
没有静态和其它类型的注释
没有模板
内建string、slice和map
数组边界检查
最后介绍下大牛真身,最大牌的当属B和C语言设计者、Unix和Plan 9创始人、1983年图灵奖获得者Ken Thompson,这份名单中还包括了Unix核心成员Rob Pike(go语言之父)、java HotSpot虚拟机和js v8引擎的开发者Robert Griesemer、Memcached作者Brad Fitzpatrick,等等。
四、Go 语言能做什么
Go 语言从发布 1.0 版本以来备受众多开发者关注并得到广泛使用,Go 语言的简单、高效、并发特性吸引了众多传统语言开发者的加入,而且人数越来越多。
鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web 应用、API应用、下载应用等;除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。
服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
分布式系统、数据库代理器、中间件等,例如Etcd。
网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
数据库操作
开发云平台,目前国外很多云平台在采用Go开发。
五、国内外有哪些企业或项目使用Go语言
Go发布之后,很多公司特别是云计算公司开始用Go重构他们的基础架构,很多都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。
使用 Go 语言开发的开源项目非常多。早期的 Go 语言开源项目只是通过 Go 语言与传统项目进行C语言库绑定实现,例如 Qt、Sqlite 等;后期的很多项目都使用 Go 语言进行重新原生实现,这个过程相对于其他语言要简单一些,这也促成了大量使用 Go 语言原生开发项目的出现。
云计算基础设施领域,代表项目有:docker、kubernetes、etcd、consul、cloudflare CDN、七牛云存储等
基础软件领域代表项目有:tidb、influxdb、cockroachdb等。
微服务领域代表项目有:go-kit、micro、monzo bank的typhon、bilibili等。
互联网基础设施领域有:以太坊、hyperledger等。
采用Go的一些国外公司,如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司;
采用Go开发的国内企业:如阿里云、百度、小米、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等公司。
下面着重介绍几个:
Docker
简介:Docker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker 可以在一台物理服务器上快速运行一个或多个实例。基于lxc的一个虚拟打包工具,能够实现PAAS平台的组建。例如,启动一个 CentOS 操作系统,并在其内部命令行执行指令后结束,整个过程就像自己在操作系统一样高效。项目链接:https://github.com/docker/dockerKubernetes
简介:Google 公司开发的构建于 Docker 之上的容器调度服务,用户可以通过 Kubernetes 集群进行云端容器集群管理。
项目链接:https://github.com/kubernetes/kubernetes
etcd
项目链接:https://github.com/coreos/etcd
简介:一款分布式、可靠的 KV 存储系统,可以快速进行云配置。有质量和能量么?
虽然光没有质量是正确的,但这一事实并不意味着光是纯能量。光由称为光子的基本量子对象组成,我们将其与其他基本量子对象(例如电子和中微子)一起列出。该列表上的每个对象都包含几个不同的属性,这些属性确定对象的行为。质量和动能只是基本量子物体可以承载的几个特性中的两个。 说光是“纯能量”将意味着光仅携带能量的性质,而没有其他性质,这是不正确的。
单个光子(可能是光的最小位)具有以下属性:波长——这是光子波峰之间的空间距离。频率——这是波在固定位置在单位时间内达到峰值的次数。人类对光的颜色的感知与光的频率密切相关。因此,“频率”可以与“颜色”宽松地互换使用。波矢——这是光子的传播方向,以及单位长度内存在的波峰数量。周期——这是在固定位置的光子波的两个峰值之间的时间。速度——这是光子在太空中传播的速率,始终为299792.458千米/秒。位置——这是光子在空间中的物理位置。尽管单个光子的位置没有很好地定义,并且存在时存在固有的不确定性,但是光子确实携带一定程度的位置信息,因此使我们能够根据光子撞击传感器的位置在数码相机中记录图像。波相位——这是两个不同光子的波峰的相对位置,对于正确描述干涉效应很重要。动量——这是一种运动属性,描述了光与其他物体碰撞并使它们运动的能力。自旋——这是一种量子性质,大致类似于我们在日常生活中看到的旋转类型。光子的自旋也称为极化状态,代表固有的角动量。光子具有整数自旋,因此是玻色子,它不遵守保利排斥原理。这意味着光子可以以相同状态存在,例如在激光束中。量化的电磁场——光子包含电磁场。更准确地说,光子是整个电磁场中的量化波动。这样,光子能够与电荷相互作用。带电粒子可以产生光子,破坏光子和散射光子。同样,光子可以在带电粒子上施加力。此外,光子服从量子场论的原理和方程。动能——这是光因其运动而产生的能量。注意,因为光子没有质量,所以其动能等于其总能量。光的能量使它可以根据广义相对论创建引力场。显而易见,能量只是光子携带的众多特性之一。光子可以在没有质量的情况下很好地存在,因为它们具有许多其他特性使其在物理上是真实的。请注意,上面列出的许多属性彼此之间非常紧密地关联。上面列出的许多属性不是独立的属性,而只是定义其他属性的方式稍有不同。
例如,光子的能量E等于其频率f乘以常数E = hf。类似地,光子的动量p等于其波矢k乘以常数p =ℏk。同样,周期T只是线性频率f的倒数,T = 1 / f,波长λ只是波矢幅度k乘以2π的倒数,λ=2π/ k,速度c只是频率乘以波长,c =fλ。尽管上面列出的某些属性可能被视为多余的,但这并不能改变光子不仅具有能量还具有更多属性的事实。
光子还具有一些不表现出的特性,仅仅是因为它们具有光子的性质。
以下列表表示光子不具有的属性:电荷轻子数重子数风味量子数磁矩(尽管光子可能通过成对效应间接产生磁矩)质量如我们所见,质量只是基本对象可能具有或可能不具有的许多属性之一。因此,质量的存在不会给物体带来任何程度的物理现实,即使质量是我们日常生活中最熟悉的属性。此外,没有质量不会使物体变得更加“纯净”。我们在日常生活中对质量非常熟悉,以至于我们可能会说“没有质量的物体确实不存在”。但是这个说法是错误的。
更准确的说法是:“没有物理可观察特性的对象实际上并不存在。”由于除了质量以外,还有许多基本属性,因此我们可以看到,没有质量,对象就可以存在。再次,质量的缺乏并不能自动暗示物体是纯能量,因为还涉及许多其他属性。请注意,质量实际上只是能量的另一种形式。基本物体的总能量是其质量能加上其动能(请注意,势能由物体系统而不是单个物体持有)。
有趣的是,如果我们将许多光子组合成一束光束,则可以按照光子的模式对诸如图像之类的信息进行编码。上面列出的每个光子属性都可以用来承载信息。例如,人眼、传统相机和传统太空望远镜从一组光子中提取光子位置和频率(颜色)信息,以形成图像。
无线电天线会沿着它们产生的无线电波的长度改变频率(FM)或光子计数(AM),以对信息进行编码。诸如在某些太空望远镜中使用的干涉仪可测量光束中光子的相位特性,以提取有关产生光束的光源的信息。光场相机从一组光子中提取光子位置、频率和波矢方向性,以捕获三维照片。如果光仅仅是“纯能量”,那么人眼、照相机、无线电天线和太空望远镜将无法工作。
那么光为什么这么快呢?这是一个有趣的问题。光是一种复杂的现象,据我所知,我们不知道为什么光如此之快地传播根本原因。但是,在上面文章中我们了解什么是光一些属性。知道光与电和磁密切相关,因此让我们先谈一谈电磁场,这有助于理解光为什么会这么快。
我们已经很熟悉磁场的影响:磁场是使磁铁粘在冰箱上的原因,而地球的磁场使指南针指向北方。电场略有不同:打开手电筒时,电池中的电场使电流流过电线和灯泡,从而点亮灯泡。电场也是使相反电荷相互吸引和同电荷彼此排斥的原因。
当我们仔细研究电场和磁场的行为时,我们会发现电场和磁场的波有可能在真空空间中传播。 “波”是什么意思?我们小时候可能尝试过握住绳索或绳子的一端,而其他人则握住另一端,上下摆动时,我们会看到波浪从绳索的一端向下传播到另一端。(我们是否注意到一个问题:波沿着绳索传播的速度有多快?取决于我们来回摆动的速度有多快。)
当我们说“电和磁波”时,类似于绳索中的波。我们可以在某一点改变电场或磁场,类似于扭动绳子的末端,并且扰动会远离我们。(改变一个点处的磁场的一种方法是将磁铁固定在那里,然后来回摆动。)但与绳索中的波不同,这些波实际上向四面八方远离我们。物理学家经过多年的研究发现,光由电场和磁场波组成。
爱因斯坦相对论认为,在真空中光速是恒定的,299792.458千米/秒,这是我们宇宙的最快速度。事实证明,在真空中,例如在太空中,光始终以相同的速度传播,跟磁场来回摆动的速度无关紧要。在空气中,光波的传播速度要比在真空中慢得多,在玻璃中,波的传播速度只能是在真空中的三分之二。
我们可能想知道为什么我们看不到光的波动。在上面的介绍中,我们知道c =fλ,构成我们可见光的领域以非常快的速度摆动(f)——每秒大约有500,000,000,000,000次。我们的眼睛无法分辨出磁场实际上是在摆动,眼睛只能看到稳定的光量。当磁场每秒摆动约5亿亿次时,我们的眼睛会看到红光。如果我们的眼睛注视着那些摆动快两倍的速度,光就会变成蓝色。可见光电场和磁场的摇摆并不是唯一的现象。我们从广播电台听到音乐的原因是,我们的广播电台可以检测到空中传播的电场和磁场,而这些电场和磁场每秒仅摆动约100,000,000次。例如,如果我们调谐到93.1 FM,则我们天线正在每秒拾起93,100,000次摆动的场。对于101.9 FM,该字段每秒摆动101,900,000次。
这远不及可见光中的摆动快。但是无线电波和可见光非常相似——它们都是电场和磁场波,它们以不同的速率摆动。可见光、紫外光、红外辐射、无线电波、X射线、伽马射线、微波和雷达波,都是由以不同速率摆动的电场和磁场组成的,它们都以光速传播。
综合上述介绍,光在真空中速度传播是恒定的,为常数c,它是宇宙最快的速度,跟光的电磁场的摆动(f)没有关系。但光在媒介中的快慢跟光的电磁场的摆动速度(f)有关,而且跟还跟光的波长(λ)有关,之所以在媒介中光速度如此之快,那是因为其光的电磁场摆动频率太快了。但为什么光的频率会这么快,目前还是一个未知的谜题,这需科学家们去研究发现。