随着人工智能的火热,Python作为这块领域中的佼佼者,也得到了迅猛的发展。作为一门强类型的动态脚本语言,Python与JavaScript非常相似,无论是语法思维上还是可用的基础工具(内置API)上,对于写惯了JavaScript的我们来说,

Python非常的友好,友好在哪呢?我们一起来看看吧。

由于我们都是有JavaScript基础了,所以学习Python的方式得做一些小改变,不需要去看文档学习API,那样其实蛮累的,毕竟脱离了生产的学习API,就犹如听着昏昏欲睡,毫无感情的色彩的四六级听力,嚼着一段段生搬硬套硬凑生词的阅读理解,你很难真正的听懂、读懂它。(有幸在车站跟外国人交流过,他们说的话听起来真的

很优美,很灵动,这跟一直是第一声的四六级完全不同,好吧,扯远了)

学Python,我的理解 —— 就像学JQuery,学会一个$(id class tag),理解它比原生JS对于DOM操作的简化就够了,其他的五花八门的API,你在生产环境下用上一遍,自然而然就会了。

这里我们也是一样,不学习它的API,我们用Python来解决问题,解着解着,你自然也就会了,而且可以让你的头发少掉那么几根。= =

我们遇到的第一个问题是 —— 抽奖。

用JavaScript写抽奖你肯定信手拈来,呼啦啦看着那个大转盘咕噜咕噜就是一顿猛操作。这里我们只取其中最重要的一部分,也就是摇出幸运者的逻辑。我们可以把它抽象成下面这样:

1、抽奖箱里的号码为员工号码,我们看成一个数组,假设这时候的员工号码为1~100号。

2、抽奖到的那位不能再继续参与抽奖。

3、假设我们要抽取若干位幸运者(比如5位幸运者)

这时候我们想:先建一个数组来装幸运者,接着随机一个从1-100号的数字,并且判定一下这个随机出来的数字是否在幸运者数组中,如果没有就加进去,有就重新随机。

我们先来看一下我们熟悉的JavaScript,基本上你可以发现有条不紊的按照我们的思路进行着。

const randomNums_0 = (a, b, n) => {

//建一个数组

let res = [];

//生成 a~b 的随机号码

const createRandom = (a, b) => Math.floor(Math.random() * (b - a) + a);

while(n) {

let val = createRandom(a, b);

if(res.indexOf(val) === -1) {//如果这个随机的号码在幸运者的队列中不存在

res.push(val);//则将这个号码添加进去

n --;//这里的n是幸运者的人数,当队列中多了一个幸运者,n就减一

}//否则重新生成随机数

}

return res;

}

console.log(randomNums_0(1, 100, 5));

这时做过了一遍之后,再返回来看看Python版。(这里的Python是Python3.7,对于Python2的语法异同(语法不兼容其实不少,最常见的比如Python2的print ***与Python3的 print(***)。这里就不说了,只说Python3。)

# 简单抽奖 —— 生成n个输入范围在a ~ b内的不同随机整数。

# 难度 ★★

# 函数接收3个数字,分别为a, b, n。

def _20191020():

# the first solution

def randomNums_0 (a, b, n):

res = []

while n:

num = math.floor(random.random() * (b - a) + a)

if num not in res:

res.append(num)

n -= 1

return res

print(randomNums_0(1, 100, 5))

基本的套路其实一模一样,只不过稍微语法不同:

1、 JavaScript的函数定义是通过function,或者通过箭头表达式。而Python则是通过def。def其实就是定义的意思,define嘛。

// JavaScript

function fn () { ... }

const fn = argus => { ... }

# Python

def fn ():

python的函数没有大括号包裹,而是通过":"来做判定。

2、 我们的判断数组是否包含某个成员,我们的初步思路就是判断它的索引是不是大于-1,这里Python做得更好,它直接就是:

if num not in res:

你在其他语言上很难(除了SQL)看到如此语义化的代码,简直就是一句赤裸裸的英文句子,这也是我向往的终极代码编程方式 —— 代码就是很直白的英文句子(当然也可以中文)。

3、 类似于数组的push在python中是append,n - - 在python中没有,python只能是n -= 1等这些小改动,对于我们来说其实都不能说是负担。

4、 JavaScript最大的特点就是你几乎开箱即用,很多功能都内置了,而Python其实也是,只不过没有全部放在名称空间里(你可以理解成全局作用域),比如数学的math,随机数的random,正则的re。它们都是需要import进来的。比如下面这样:

import math

import numpy

import re

import random

from functools import reduce

5、 你有没发现这些import跟JavaScript非常相似,甚至关键词都一样的,是的,这里你几乎可以用JavaScript的模块化思想来类比,你可以很容易理解并掌握它。

好了,虽说仅仅只是简单的一个问题解决过程,但你可以掌握不少这方面的语法与思想了吧。

这时候对于这一个问题的解决思路我抱着一丝疑惑,按照这样的方式,是不是存在着新出的随机号码可能已经存在于幸运者队列中了,假如这时候我要抽取的是50位呢?是不是无形中冲突的概率大大的增加?假如是抽99位(当然这时候就变成抽1位了),那是不是新出的随机数一直迎面撞到数组里?然后就一直随机一直撞,想一下都累。有木有新的方式来解决呢?这是肯定的。

这时候我们做的就是先生成一个全部参与者号码组成的数组,先随机抽取出一位,这时候数组就将这一位移除,接着继续抽取下一位,值得指定人数的幸运者选出即停止。

看看下面的代码:

// the second solution —— 利用数组机制

const randomNums = (a, b, n) => {

let arrList = Array.from({length: b - a}, (item, index) => index + a),

res = [];

while(n --) {

let i = Math.floor(Math.random() * arrList.length);

res.push(arrList[i]);

arrList.splice(i, 1);

}

return res;

}

return randomNums(1, 100, 5);

在看一下Python的代码:

# the second solution

def randomNums(a, b, n):

all = list(range(a, b))

res = []

while n:

index = math.floor(random.random() * len(all))

res.append(all[index])

del all[index]

n -= 1

return res

return randomNums(1, 100, 5)

解决思路的话其实没啥差别。只不过这里你可以发现:

1、 我们数组的删除某些成员用的是splice,其实还不是那么的直观,看看Python

del all[index]

直接就是一句delete,删除,看着就有种莫名的爽。

2、 Python生成list也非常简单,比之JavaScript更为简洁。

// JavaScript

let arrList = Array.from({length: b - a}, (item, index) => index + a)

# Python

arrList = list(range(a, b))

接下来我们遇到的第二个问题是 —— Fizz Buzz。

来看一下问题的描述:

# Fizz Buzz

# 难度 ★★

# 给定一个 数字 作为输入值, 打印出从 1 到给定数字的所有整数。

# 但是,当整数可以被 2 整除时,打印出“Fizz”; 当它可以被3整除时,打印出“Buzz”;

# 为了方便,可以将结果先合并成一个数组一起输出

这个采用JavaScript解决的话,我们几乎可以不假思索的写出:

const fizzBuzz = num => {

let arr = Array.from({length: num}, (item, index) => index + 1); // 先生成一个从1至输入值的数组

return arr.map(item => item % 2 === 0 ? 'Fizz' : item % 3 === 0 ? 'Buzz' : item); // 做一次map映射

}

console.log(fizzBuzz(20));

假如采用的是python呢?看看哈:

def _20191021():

def mapRes (item):

return 'Fizz' if item % 2 == 0 else 'Buzz' if item % 3 == 0 else item

def fizzBuzz(n):

all = list(range(1, n + 1))

return list(map(mapRes, all))

return fizzBuzz(20)

看起来好像也很相似,也有map,也是将一个函数作为参数传进map,是不是很cool?

1、 Python也有map,而且用法几乎和我们JavaScript一模一样,只不过它没有JavaScript这样的非常典型的链式调用。而且Python中的map对应的回调函数中,也没有index的值。另外就是map直接存在于名称空间,无需引入任何的包。

// JavaScript

let arr = [1,2,3,4]

arr.map(item => item ** 2);

# Python

arr = [1,2,3,4]

def fn (item):

return item ** 2

map(fn, arr)

2、 看到上面的两段代码,你是不是也发现了Python的注释?Python里的注释跟很多的配置文件(比如nginx)一样用“#”作为注释的关键词,当然它还有" “、”’ '"这样的注释,可以自个去看看吧。

3、 看到上面的JavaScript代码好像用到了三元运算符,而Python中怎么不写呢?其实不是不想写,是Python中的三元是这样的,反正看起来不像三元运算。

res = a if fn else b # 就是说 res 如果满足fn 那就是a,否则就是b

当然了,你完全可以(尽管你可能在代码评审时被各种爆锤)

res = a if fn1 else b if fn2 else c if fn3 else d if fn4 else e ....

4、 Python再怎样,毕竟也是一门强类型的语言,对于类型检查也是非常注重的哈,你没办法将一个数字型的与一个字符串型的数据强行合并。

比如我们在JavaScript中很常见的:

let a = 1,

b = 'dorsey';

console.log(a + b)

请相信我,你这在Python中是会报错的。

所以假如你有这样的需要,那么你可以这样:

a = 1

b = 'dorsey'

print(str(a) + b)

其实就是做一步在强类型语言中非常常见的类型强制转换。不过最好还是在定义时更规范更有前瞻性的去选择类型。

学习JavaScript时,你是不是也会时不时的去浏览器将各大类型的内置对象(比如Object,Array,String…)打印一下,看看它们的原型,看看是否增加了什么新东西?

而Python呢,其实相较于JavaScript那些方法或对象,要更加复杂,内置的模块池也更加的庞大。你可以看看:

光一个最外层的文件目录就有这么多了,还得说可能有目录套目录等等,比如你看到__XXX__这样的变量,基本就是一个内部的对象了。

当然了,正如开头所说,这样一个个API去试是很累的方式,但不代表我们不可以全部浏览一遍,对吧?

java程序员如何评价python_有Java基础的程序员,是如何看待Python这位少女的?相关推荐

  1. 15-微信小程序商城 产品评价页布局(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)

    产品评价页布局 本节主要讲解产品评价页的布局和实现,效果如图13-22所示. 1.布局分析 结构布局分析示意如图13-23所示. 根据上面的布局分析,我们会产生基础的框架,代码示例如下: <vi ...

  2. 为什么程序员都不愿意升级 Java 8?

    [CSDN 编者按]不说 Android,Java 本身都很碎片化.尽管 Java 升级换代,但于开发者来说,还是紧紧地抱着 Java 8 不放.这是为什么呢?一起来看. 作者 | Trisha Ge ...

  3. Java技术本纪(2005.08.18 来自:《程序员》杂志)

    Java虚拟机的  10    年 文/曹晓刚 Java虚拟机的起源与构造当我们说到"Java"这个词的时候,指的是四个相互关联的概念:Java语言.Java API.Java C ...

  4. 程序员要怎么高效学习Java,大学生or小白的你看完这篇的你离BAT又近了一大步

    这篇文章大体上会从以下几个部分展开: 认清自己. 学习目的. 时间管理. 学习方法. 学习的步骤. 获取知识的途径 影响学习的几个因素 自己的心态. 外物的影响. 其他想说的 大学生的学习 一些感悟 ...

  5. java书籍_这本最适合夯实基础的Java 书籍,80% 的 Java 程序员没认真看过

    今天要给大家带来的一本书,是大名鼎鼎的head first系列丛书的一本<head first Java>相信很多学习Java的朋友对它都不会陌生. 深入浅出系列书籍是由O'Reilly出 ...

  6. 无责任书评:每个Java程序员都应该深入理解Java虚拟机!

    Java这门语言的发展是很有意思的,它不像Python, Ruby 等完全是开源社区驱动,也不像C#,VB.NET主要由微软操刀.它是一个以Oracle(之前是Sun)为主,各大巨头一起参与,一起制定 ...

  7. 新手Java程序员找工作更看重Java项目经验?

    动力节点IT培训,全真项目实操实训,贯穿八大行业,彻底帮助学员摆脱纸上谈兵的尴尬,一技成,天下行. 新手Java程序员找工作更看重Java项目经验?这个问题,想必是很多学Java的朋友也特别好奇的地方 ...

  8. 为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...

    近日,有人在网上问了这个问题,引起了网友热议: 为什么中国这么多高薪程序员,开发不出Java,Typescript, Python, Rust, Node.js这些基础设施? 对这个问题,大家从不同角 ...

  9. java三年技术差_3年经验Java程序员面阿里P6 差距在哪里

    虽然这位小伙伴觉得自己工作三年了,结果阿里连面都不面就把自己挂了,这让自己感到很伤心.但是还是有网友觉得,三年不到p6,很正常啊,明年再面就没有问题啦! Java程序员3年经验面阿里P6,2面连面都没 ...

最新文章

  1. ASP.NET(C#)常用代码30例
  2. Python ord()函数和chr()函数
  3. ca证书 csr_linux下使用openssl生成 csr crt CA证书
  4. 科普 | 单精度、双精度、多精度和混合精度计算的区别是什么?
  5. 穷人变富的过程中,最大的阻碍是什么?
  6. pytorch模型保存
  7. Ros安装过程及sudo rosdep init失败解决方法
  8. 《System语言详解》——6. 语句种类
  9. matlab trplot2,一知半解|MATLAB机器人建模与仿真控制(2)
  10. 如何解决SQL server 恢复挂起状态
  11. HTML CSS基础
  12. 冲压模板自动标注LISP_自动标注.LSP
  13. 为什么说苏宁必买万达百货
  14. 计算机初中信息技术教学软件,初中信息技术教学工作计划精选
  15. JAVA Map类compute方法详解及样例
  16. 树莓派hwclock命令参数及用法详解--linux显示/设置硬件时钟命令
  17. 为什么计算机无法读取u盘,电脑无法识别读取U盘怎么办?逐一排查解决问题
  18. b站弹幕姬python_B站弹幕姬()分析与开发(下篇)
  19. Docker的平行空间通信
  20. 基因-药物相互作用数据库 DGIdb 介绍

热门文章

  1. 南京师范大学计算机复试刷人吗,复试被刷为什么偏偏是你。正确认识南师大复试...
  2. quartus原理图设计及 自带仿真
  3. 如何卸载Win10的Microsoft Edge浏览器(一个很简便的方法)
  4. gradient设置上下渐变_CSS3 渐变(Gradients)
  5. 问道手游安卓服务器维护公告,问道手游安卓服务器6月7日4时维护公告
  6. 【直通华为HCNA/HCNP系列R篇8】VRRP技术原理及配置与管理-王达-专题视频课程
  7. iOS开发ApplePay的介绍与实现
  8. 12 readdir 函数
  9. 社招两年,终于冲进了决赛圈,现在犹豫是去阿里P6还是字节2-1,希望大家给点经验
  10. Photoshop“消失点滤镜”小实例