Python 和 JS 有什么相似?(python和js哪个快)
myzbx 2025-06-13 15:36 32 浏览
Python 是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有 Python 的身影。作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数、解构赋值、Decorator等),同时本文会对 Python 的一些用法与 JS 进行类比。不管是提升自己的知识广度,还是更好地迎接 AI 时代,Python 都是一门值得学习的语言。
数据类型
在 Python 中,最常用的能够直接处理的数据类型有以下几种:
- 数字[整数(int)、浮点型(float)、长整型(long)、复数(complex)]
- 字符串(str)
- 布尔值(bool)
- 空值(None)
除此之外,Python 还提供了列表[list]、字典[dict] 等多种数据类型,这在下文中会介绍。
类型转换与类型判断
与 JS 十分类似,python 也能实现不同数据类型间的强制与隐式转换,例子如下:
强制类型转换:
int('3')# 3
str(3.14)# '3.14'
float('3.14')# 3.14
# 区别于 JS 只有 Number 一种类型,Python 中数字中的不同类型也能相互强制转换
float(3)# 3.0
bool(3)# True
bool(0)# False隐式类型转换:
1+1.0# 2.0 1+False# 1 1.0+True# 2.0 # 区别于 JS 的 String + Number = String, py 中 str + int 会报错 1+'1'# TypeError: cannot concatenate 'str' and 'int' objects
此外写代码的时候经常会需要判断值的类型,可以 使用 python 提供的 type() 函数获取变量的类型,或者使用 isinstance(x, type) 来判断 x 是否属于相应的 type 类型。
type(1.3)==float# True
isinstance('a', str)# True
isinstance(1.3,int)# False
isinstance(True,bool)# True
isinstance([], list)# True
isinstance({}, dict)# True有序集合类型
集合是指包含一组元素的数据结构,有序集合即集合里面的元素是是按照顺序排列的,Python 中的有序集合大概有以下几类:list, tuple, str, unicode。
list 类型
Python 中 List 类型类似于 JS 中的 Array,
''' ''' L =[1,2,3] print L[-1]# '3' L.append(4)# 末尾添加元素 print L # [1, 2, 3, 4] L.insert(0,'hi')# 指定索引位置添加元素 print L # ['hi', 1, 2, 3, 4] L.pop()# 末尾移除元素 L.pop(2) ?????? 2 ??? print L # ['hi', 1, 2, 3]
tuple 类型
tuple 类型是另一种有序的列表,中文翻译为" 元组 "。tuple 和 list 非常类似,但是,tuple 一旦创建完毕,就不能修改了。
t =(1,2,3) print t[0]# 1 t[0]=11# TypeError: 'tuple' object does not support item assignment t =(1) print t # 1 t 的结果是整数 1 t =(1,)# 为了避免出现如上有歧义的单元素 tuple,所以 Python 规定,单元素 tuple 要多加一个逗号"," print t # (1,)
无序集合类型
dict 类型
Python 中的 dict 类型类似于 JS 中的 {} (最大的不同是它是没有顺序的), 它有如下特点:
查找速度快 (无论 dict 有 10 个元素还是 10 万个元素,查找速度都一样)占用内存大 (与 list 类型相反)dict 中的 key 不能重复dict 中存储的 key-value 序对是没有顺序的
'''
'''
d ={
'a':1,
'b':2,
'c':3
}
print d # {'a': 1, 'c': 3, 'b': 2} 可以看出打印出的序对没有按正常的顺序打出
# 遍历 dict
for key,value in d.items():
print('%s: %s'%(key,value))
# a: 1
# c: 3
# b: 2set 类型
有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,而且要保证这个集合的元素不会重复,这时,set 类型就派上用场了。set 类型有如下特点:
set 存储的元素和 dict 的 key 类似,必须是不变对象set 存储的元素也是没有顺序的
s =set(['A','B','C','C'])
print s # set(['A', 'C', 'B'])
s.add('D')
print s # set(['A', 'C', 'B', 'D'])
s.remove('D')
print s # set(['A', 'C', 'B'])Python 中的迭代
在介绍完 Python 中的有序集合和无序集合类型后,必然存在遍历集合的 for 循环。但是和其它语言的标准 for 循环不同,Python 中的所有迭代是通过 for ... in 来完成的。以下给出一些常用的迭代 demos:
索引迭代:
L =['apple','banana','orange'] for index, name in enumerate(L): # enumerate() 函数把 ['apple', 'banana', 'orange'] # 变成了类似 [(0, 'apple), (1, 'banana'), (2, 'orange')] 的形式 print index,'-', name # 0 - apple # 1 - banana # 2 - orange
迭代 dict 的 value:
'''
'''
d ={'apple':6,'banana':8,'orange':5}
print d.values()# [6, 8, 5]
for v in d.values()
print v
# 6
# 8
# 5迭代 dict 的 key 和 value:
d ={'apple':6,'banana':8,'orange':5}
for key, value in d.items()
print key,':', value
# apple : 6
# banana: 8
# orange: 5切片操作符
Python 提供的切片操作符类似于 JS 提供的原生函数 slice()。有了切片操作符,大大简化了一些原来得用循环的操作。
L =['apple','banana','orange','pear'] L[0:2]# ['apple', 'banana'] 取前 2 个元素 L[:2]# ['apple', 'banana'] 如果第一个索引是 0,可以省略 L[:]# ['apple', 'banana', 'orange', 'pear'] 只用一个 : ,表示从头到尾 L[::2]# ['apple', 'orange'] 第三个参数表示每 N 个取一个,这里表示从头开始,每 2 个元素取出一个来
列表生成器
如果要生成 [1x1, 2x2, 3x3, ..., 10x10] 怎么做?方法一是循环:
L =[] for x in range(1,11): L.append(x * x)
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的 list:
# 把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把 list 创建出来 [x * x for x in range(1,11)] # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表生成式的 for 循环后面还可以加上 if 判断(类似于 JS 中的 filter() 函数),示例如下:
[x * x for x in range(1,11)if x %2==0] # [4, 16, 36, 64, 100]
for 循环可以嵌套,因此,在列表生成式中,也可以用多层 for 循环来生成列表。
[m + n for m in'ABC'for n in'123'] # ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']
Python 函数
默认参数
JS 中 ES6 的 默认参数正是借鉴于 Python,用法如下:
'''
'''
def greet(name='World'):
print'Hello, '+ name +'.'
greet()# Hello, World.
greet('Python')# Hello, Python.可变参数
类似于 JS 函数中自动识别传入参数的个数,Python 也提供了定义可变参数,即在可变参数的名字前面带上个 * 号。
def fn(*args):
print args
fn() # ()
fn('a')# ('a',)
fn('a','b')# ('a', 'b')Python 解释器会把传入的一组参数组装成一个 tuple 传递给可变参数,因此,在函数内部,直接把变量 args 看成一个 tuple 就好了。
常用高阶函数
Python 中常用的函数 (map、reduce、filter) 的作用和 JS 中一致,只是用法稍微不同。
- map 函数: 接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
def f(x): return x * x print map(f,[1,2,3,4,5,6,7,8,9])# [1, 4, 9, 16, 25, 36, 49, 64, 81]
- reduce 函数: 接收一个函数 f 和一个 list(可以接受第三个值作为初始值),reduce() 对 list 的每个元素反复调用函数 f,并返回最终结果值。
def f(x, y): return x * y reduce(f,[1,3,5])# 15
- filter 函数: 接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter() 根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新 list。
''' ''' def is_odd(x): return x %2==1 filter(is_odd,[1,4,6,7,9,12,17])# [1, 7, 9, 17]
匿名函数
和 JS 的匿名函数不同的地方是,Python 的匿名函数中只能有一个表达式,且不能写 return。拿 map() 函数为例:
map(lambda x: x * x,[1,2,3,4,5,6,7,8,9])# [1, 4, 9, 16, 25, 36, 49, 64, 81]
关键词 lambda 表示匿名函数,冒号前面的 x 表示函数参数,可以看出匿名函数 lambda x: x* x实际上就是:
def f(x): return x * x
闭包
之前写过一些关于 JS 闭包的文章,比如 深入浅出JavaScript之闭包(Closure)、以及 读书笔记-你不知道的 JavaScript (上),Python 中闭包的定义和 JS 中的是一致的即:内层函数引用了外层函数的变量,然后返回内层函数。下面来看下 Py 中闭包之 for 循环经典问题:
''' ''' # 希望一次返回3个函数,分别计算1x1,2x2,3x3: def count(): fs =[] for i in range(1,4): def f(): return i * i fs.append(f) return fs f1, f2, f3 = count()# 这种写法相当于 ES6 中的解构赋值 print f1(), f2(), f3()# 9 9 9
老问题了,f1(), f2(), f3() 结果不应该是 1, 4, 9 吗,实际结果为什么都是 9 呢?
原因就是当 count() 函数返回了 3 个函数时,这 3 个函数所引用的变量 i 的值已经变成了 3。由于 f1、f2、f3 并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时,i 已经变为 3 了。
要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。代码修改如下:
方法一: 可以理解为创建了一个封闭的作用域,i 的 值传给 j 之后,就和 i 没任何关系了。每次循环形成的闭包都存进了内存中。
def count(): fs =[] for i in range(1,4): def f(j): def g():# 方法一 return j * j return g r = f(i) fs.append(r) return fs f1, f2, f3 = count() print f1(), f2(), f3()# 1 4 9
方法二:思路比较巧妙,用到了默认参数 j 在函数定义时可以获取到 i 的值,虽然没有用到闭包,但是和方法一有异曲同工之处。
''' ''' def count(): fs =[] for i in range(1,4): def f(j = i):# 方法二 return j * j fs.append(f) return fs f1, f2, f3 = count() print f1(), f2(), f3()# 1 4 9
decorator 装饰器
ES6 的语法中的 decorator 正是借鉴了 Python 的 decorator。decorator 本质上就是 一个高阶函数,它接收一个函数作为参数,然后返回一个新函数。
那装饰器的作用在哪呢?先上一段日常项目中用 ts 写的网关代码:
@Post('/rider/detail') // URL 路由
@log() // 打印日志
@ResponseBody
publicasync getRiderBasicInfo(
@RequestBody('riderId') riderId: number,
@RequestBody('cityId') cityId: number,
){
const result =awaitthis.riderManager.findDetail(cityId, riderId)
return result
}可以看出使用装饰器可以极大地简化代码,避免每个函数(比如日志、路由、性能检测)编写重复性代码。
回到 Python 上,Python 提供的 @ 语法来使用 decorator, @等价于 f = decorate(f)。下面来看看 @log() 在 Python 中的实现:
''' ''' # 我们想把调用的函数名字给打印出来 @log() def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10) # 来看看 @log() 的定义 def log(): def log_decorator(f): def fn(x): print'调用了函数'+ f.__name__ +'()' return f(x) return fn return log_decorator # 结果 # 调用了函数 factorial() # 3628800
class
面向对象编程
面向对象编程是一种程序设计范式,基本思想是:用类定义抽象类型,然后根据类的定义创建出实例。在掌握其它语言的基础上,还是比较容易理解这块知识点的,比如从下面两种写法可以看出不同语言的语言特性间竟然有如此多的共性。
es6: (附:本文的主题是 python,所以只是初略展示下 js 中类的定义以及实例的创建,为了说明写法的相似性)
classPerson{
constructor(name, age){
this.name = name
this.age = age
}
}
const child1 =newPerson('Xiao Ming',10)Python: (核心要点写在注释中)
# 定义一个 Person 类:根据 Person 类就可以造成很多 child 实例
classPerson(object):
address ='Earth'# 类属性 (实例公有)
def __init__(self, name, age):# 创建实例时,__init__()方法被自动调用
self.name = name
self.age = age
def get_age(self):
# 定义实例方法,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和普通函数是一样的
returnself.age
child1 =Person('Xiao Ming',10)
child2 =Person('Xiao Hong',9)
print child1.name # 'Xiao Ming'
print child2.get_age()# 9
print child1.address # 'Earth'
print child2.address # 'Earth'继承
child 属于 Student 类,Student 类属于 People 类,这就引出了继承: 即获得了父类的方法属性后又能添加自己的方法属性。
'''
'''
classPerson(object):
def __init__(self, name, age):
self.name = name
self.age = age
classStudent(Person):
def __init__(self, name, age, grade):
super(Student,self).__init__(name, age)# 这里也能写出 Person.__init__(self, name, age)
self.grade = grade
s =Student('Xiao Ming',10,90)
print s.name # 'Xiao Ming'
print s.grade # 90可以看到子类在父类的基础上又增加了 grade 属性。我们可以再来看看 s 的类型。
isinstance(s,Person) isinstance(s,Student)
可以看出,Python 中在一条继承链上,一个实例可以看成它本身的类型,也可以看成它父类的类型。
最后,小编想说:我是一名python开发工程师,整理了一套最新的python系统学习教程,想要这些资料的可以关注私信小编“01”即可,希望能对你有所帮助。
相关推荐
- 如何设计一个优秀的电子商务产品详情页
-
加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...
- 怎么在JS中使用Ajax进行异步请求?
-
大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...
- 中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革
-
前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...
- 前端监控 SDK 开发分享_前端监控系统 开源
-
一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...
- Ajax 会被 fetch 取代吗?Axios 怎么办?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...
- 前端面试题《AJAX》_前端面试ajax考点汇总
-
1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...
- Ajax 详细介绍_ajax
-
1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...
- 6款可替代dreamweaver的工具_替代powerdesigner的工具
-
dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...
- 我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊
-
接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...
- 福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光
-
时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...
- 2021年超详细的java学习路线总结—纯干货分享
-
本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...
- 不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!
-
Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...
- 2025 年 Python 爬虫四大前沿技术:从异步到 AI
-
作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...
- 最贱超级英雄《死侍》来了!_死侍超燃
-
死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...
- 停止javascript的ajax请求,取消axios请求,取消reactfetch请求
-
一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)
