首页 文章 精选 留言 我的

精选列表

搜索[Java],共10000篇文章
优秀的个人博客,低调大师

Java基础的程序员,是如何看待Python这位少女的?

随着人工智能的火热,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嘛。 // JavaScriptfunction 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 mathimport numpyimport reimport randomfrom functools import reduce5、 你有没发现这些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 resreturn randomNums(1, 100, 5)解决思路的话其实没啥差别。只不过这里你可以发现: 1、 我们数组的删除某些成员用的是splice,其实还不是那么的直观,看看Python del all[index]直接就是一句delete,删除,看着就有种莫名的爽。 2、 Python生成list也非常简单,比之JavaScript更为简洁。 // JavaScriptlet 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直接存在于名称空间,无需引入任何的包。 // JavaScriptlet 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去试是很累的方式,但不代表我们不可以全部浏览一遍,对吧?

优秀的个人博客,低调大师

105道BAT最新Java面试题(MySQL+Redis+nginx+ookeeper+MongoDB)

MySQL面试题 主键 超键 候选键 外键2.数据库事务的四个特性及含义 视图的作用,视图可以更改么? drop,delete与truncate的区别 索引的工作原理及其种类 连接的种类 数据库范式 数据库优化的思路 存储过程与触发器的区别 Redis面试题 使用Redis有哪些好处? redis相比memcached有哪些优势? redis常见性能问题和解决方案4.MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 5.Memcache与Redis的区别都有哪些? Redis 常见的性能问题都有哪些?如何解决? redis 最适合的场景 Redis的同步机制了解么? 是否使用过Redis集群,集群的原理是什么? redis集群如何保证一致性? nginx面试题 1.请解释一下什么是Nginx? 请列举Nginx的一些特性?3.请列举Nginx和Apache 之间的不同点? 请解释Nginx如何处理HTTP请求。 在Nginx中,如何使用未定义的服务器名称来阻止处理请求? 使用“反向代理服务器”的优点是什么? 请列举Nginx服务器的最佳用途。 请解释Nginx服务器上的Master和Worker进程分别是什么? 请解释你如何通过不同于80的端口开启Nginx?10.请解释是否有可能将Nginx的错误替换为502错误、503? 在Nginx中,解释如何在URL中保留双斜线? 请解释ngx_http_upstream_module的作用是什么?13.请解释什么是C10K问题,后来是怎么解决的? 14.请陈述stub_status和sub_filter指令的作用是什么?15.解释Nginx是否支持将请求压缩到上游?16.解释如何在Nginx中获得当前的时间? 用Nginx服务器解释-s的目的是什么?18.解释如何在Nginx服务器上添加模块? nginx中多个work进程是如何监听同一个端口的?如何处理客户连接的惊群问题?20.nginx程序的热更新是如何做的? 欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。 zookeeper面试题 zookeeper是什么? zookeeper提供了什么? zookeeper文件系统 zookeeper的四种类型的znode zookeeper通知机制 zookeeper有哪些应用场景? zk的命名服务 zk的配置管理服务 zk的集群管理 zk的分布式锁 zk队列管理 zk数据复制 zk的工作原理 zk是如何保证事物的顺序一致性 zk集群下server工作状态16.zk是如何选举Leader的? 17.zk同步流程 分布式通知和协调 zk的session机制 MongoDB面试题 什么是MongoDB? MongoDB是由哪种语言写的? MongoDB的优势有哪些? 什么是数据库? 什么是集合? 什么是文档?7.MongoDB和关系型数据库术语对比图 什么是“mongod”?9.“mongod”参数有什么? 10.什么是“mongo”?11.MongoDB哪个命令可以切换数据库? 什么是非关系型数据库? 非关系型数据库有哪些类型?14.为什么用MOngoDB? 在哪些场景使用MongoDB? MongoDB中的命名空间是什么意思? 哪些语言支持MongoDB? 在MongoDB中如何创建一个新的数据库? 在MongoDB中如何查看数据库列表? MongoDB中的分片是什么意思? 如何查看使用MongoDB的连接? 什么是复制? 在MongoDB中如何在集合中插入一个文档? 在MongoDB中如何除去一个数据库? 在MongoDB中如何创建一个集合? 在MongoDB中如何查看一个已经创建的集合?27.在MongoDB中如何删除一个集合? 28.为什么要在MongoDB中使用分析器? MongoDB支持主键外键关系吗? MongoDB支持哪些数据类型? 为什么要在MongoDB中用"Code"数据类型? 为什么要在MongoDB中用"Regular Expression"数据类型?33.为什么在MongoDB中使用"Object ID"数据类型? 如何在集合中插入一个文档? “ObjectID”有哪些部分组成? 在MongoDb中什么是索引? 如何添加索引? MongoDB有哪些可替代产品?39.如何查询集合中的文档? 40.用什么方法可以格式化输出结果? 如何使用"AND"或"OR"条件循环查询集合中的文档? 在MongoDB中如何更新数据? 如何删除文档? 在MongoDB中如何排序?45.什么是聚合? 在MongoDB中什么是副本集? Mongodb存储特性与内部原理? 最后欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册