首页 文章 精选 留言 我的

精选列表

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

通过PHP与Python代码对比浅析语法差异

一、背景 人工智能这几年一直都比较火,笔者一直想去学习一番;因为一直是从事PHP开发工作,对于Python接触并不算多,总是在关键时候面临着基础不牢,地动山摇的尴尬,比如在遇到稍微深入些的问题时候就容易卡壳,于是准备从Python入门从头学起; 笔者觉得应该有不少人同样熟悉PHP或者Python语言,对另外一个门语言并不是太熟悉,有想法学习另外一门语言,希望通过这篇文章能够对大家有一点帮助。 二、知识点 最近在完成一个小作业,题目要求:通过Python代码实现,让用户输入用户名密码,认证成功后显示欢迎信息,输错三次后退出程序。 在这篇文章当中,会通过这个小作业来总结和分析PHP与Python的语法区别,主要涉及到以下几个知识点: 代码整体风格 变量命名规范 常量命名规范 注释方式 数据类型 输入输出 if语句使用 while循环 三、Python语法 在Python中需要严格遵守空格缩进,否则会报错;在每行代码后面不需要使用;,结构体的条件不需要使用(),执行体里面则不需要{}; 3.1 代码示例 # -*- coding: utf-8 -*- n = 0 while n < 3: #累计次数,用于循环条件 n = n + 1 #定义账号和密码 uname = 'tangqingsong' pwd = '123123' #接收参数 username = input('请输入用户名:') password = input('请输入密码:') #判断用户输入的账号和密码是否正确,正确将提示成功,并且退出循环体 if uname == username and pwd == password: print ('恭喜你,登陆成功~') break #三次机会用完的时候,提示错误次数,并告知即将退出 elif n == 3: print('已错误', n, '次,即将退出...') #如果在三次以内,提示还剩下几次机会 else: print('抱歉,账号或密码不正确,你还有', 3 - n, '次机会') 3.2 基本语法 下面从基本语法、数据类型、IF控制、while循环几个方面来聊聊Python代码中的一些规范 3.2.1 基础语法 变量: 在Python中变量以数字 字母 下划线组成,不能以数字开头,不能是python中的关键字,比如 while、if、elif、else、break、continue等,同样推荐使用驼峰命名和下划线命名两种规范命名格式 常量: 在Python中常量和变量在定义的方式上没有太大的区别,知识Python中约定俗成的使用全大写定义而已 注释: 在Python中,注释可以通过#来注释某行代码,也可以通过'''注释某段代码,比如'''注释内容''' 3.2.2 数据类型 在Python中,可以通过type(变量名)来获取变量的数据类型,经常使用到的数据类型有:布尔、整型、浮点型、字符串等;在布尔型中 真/True/1 假/False/0,非0的数字都是True; 在字符串中可以通过单引号和双引号两种方式定义,比如 a = '字符串' b = "字符串" 也可以使用 a = '''可以换行 这里有换行 这里也有换行 的字符串 ''' #或者三个双引号 b = """可以换行 这里有换行 这里也有换行 的字符串""" 来定义一大段字符串;字符串可以使用字符串 + 字符串的方式进行拼接,也可以使用 字符串 * 数字,将字符串重复凭借,比如 'abc' * 2,name得出的字符串便是abcabc 3.2.3 数据类型 在整型和浮点数据类型中加减乘除没有什么太特别,同样是使用+、-、*、/这四个符号,使用%可以的出余数;Python中有几个特殊的运算符,比如可以使用//进行整除,得出的结果不会有小数,如下代码所示: a = 10 // 3 # 得到的结果是 3 也可以使用**可以得到乘方,如下代码所示; b = 2 ** 2 # 得到的结果是 8 3.2.4 输入输出 输入输出:在Python中可以使用print关键字对变量进行打印输出,可以通过 input接收用户在终端中传递的参数,例如 inp = input('用户输入的时候看到的提示 :') 通过input方式接收的所有内容都是字符串类型,如果需要用来做运算需要对接收的变量进行类型转换;比如 a = int(变量名) 可以将变量转换成整型,也可以通过 f = float(变量名) 转换成浮点型; 3.3 IF控制 在Python中if语句使用的时候条件不需要使用()包括,执行体在也不需要使用{}包括,但执行体必须严格遵守缩进如下代码所示 # if a >3 and b==2: 缩进 满足条件1之后要做的事情 elif a>3 and b==3: 缩进 不满足条件1但满足条件2之后要做的事情 else: 缩进 上面的条件都不满足要做的事情 3.4 while循环 在Python中使用while方法与PHP类似,如下为伪代码所示 while a == b: 循环执行的代码 可以使用关键词break退出循环,也可以使用continue跳过循环过程中的某一步,如下代码所示 i = 1 while i < 10: i += 1 # 非双数时跳过输出 if i%2 > 0: continue # 输出双数2、4、6、8 print i # 当条件为8时候退出循环 if i == 8: break 四、PHP语法 在PHP中并不需要严格遵守空格缩进,但是和Python相对应的是在每行代码后面通常需要使用;结尾,结构体的条件也需要使用(),执行体里面同样需要{}; 4.1 代码示例 <?php $n = 0; while ($n < 3) { #累计次数,用于循环条件 $n = $n + 1; #定义账号和密码 $uname = 'tangqingsong'; $pwd = '123123'; #接收参数 fwrite(STDOUT, '请输入用户名:'); $username = trim(fgets(STDIN)); fwrite(STDOUT, '请输入密码:'); $password = trim(fgets(STDIN)); #判断用户输入的账号和密码是否正确,正确将提示成功,并且退出循环体 if ($uname == $username and $pwd == $password) { print_r('恭喜你,登陆成功~'); break; #三次机会用完的时候,提示错误次数,并告知即将退出 } elseif ($n == 3) { print_r("已错误{$n}次,即将退出..."); } else { #如果在三次以内,提示还剩下几次机会 $j = 3 - $n; print_r("抱歉,账号或密码不正确,你还有{$j}次机会"); } } 4.2 基本语法 下面从基本语法、数据类型、IF控制、while循环几个方面来聊聊PHP代码中的一些规范 4.2.1 基础语法 变量: 在PHP中变量以数字 字母 下划线组成,必须以$符号开头,且第一个字符不能以数字开头,在PHP中因为变量都是以$开头,所以基本上没有关键字的说法,但是写代码的时候尽量不要覆盖系统变量即可,同样推荐使用驼峰命名和下划线命名两种规范命名格式 常量: 在PHP中常量同样约定俗成的使用全大写定义而已,在定义的方式有专门的定义格式,比如定义DAXIA的值为tangqingsong时候,代码如下所示 const DAXIA = 'tangqingsong'; 注释: 在PHP中,注释可以通过#来注释某行代码,也可以使用//定义行代码,也可以通过/****/注释某段代码,如下代码所示 #这是行注释 //这是行注释,一般习惯是使用此种方式 /** * 块注释,一般在自定义函数和类方法的时候使用 */ 4.2.2 数据类型 在PHP中,可以通过var_dump(变量名)同时打印变量类型和值,经常使用到的数据类型有:布尔、整型、浮点型、字符串等;同样在布尔型中 真/True/1 假/False/0,非0的数字都是True; 在字符串中可以通过单引号和双引号两种方式定义,单引号中不能放变量,但是双引号是可以的,如下代码所示 $n = 123; a = '字符串'; b = "字符串{$n}"; 当大家定义块文本内容的时候,也可以使用定界符方式,如下代码所示 $a = <<<EF 这里是大文本内容,可以写任意文本,EF是自定义的,大家也可以把EF写成DAXIA,但是必须前后对应,后面的必须定格,后面一个“EF”不能用空格之类的字符; EF; 字符串可以使用符号 . 进行拼接,如下代码所示: $name = 'daxia' . 'tangqingsong'; 4.2.3 数据类型 在PHP中整型和浮点数据类型中加减乘除没有什么太特别,同样是使用+、-、*、/这四个符号,使用%可以的出余数; 4.2.4 输入输出 输入输出:在PHP中可以使用print_r关键字对变量进行打印输出,在接收标准输入方面稍微麻烦,需要先通过fwrite接收用户在终端中传递的参数,然后再通过fgets函数将变量值取出来,还需要通过trim将后面的空格过滤,例如 fwrite(STDOUT, '请输入用户名:'); $username = trim(fgets(STDIN)); 通过上面代码方式接收的所有内容都是字符串类型,但是PHP是弱类型语言,并不强大变量的数据类型,所以大部分情况无需进行类型转换,如果需要用到类型转换方法和Python大体类型,如下代码所示 a = intval(变量名) 可以将变量转换成整型,也可以通过 f = floatval(变量名) 转换成浮点型; 4.3 IF控制 if条件:在PHP中if语句的使用方法如下代码所示 <?php if (a >3 and b==2){ 满足条件1之后要做的事情 } elseif (a>3 and b==3){ 不满足条件1但满足条件2之后要做的事情 } else { 上面的条件都不满足要做的事情 } 4.4 while循环 while循环:在PHP中while的条件必须使用()包括,执行体在也必须使用{}包括,执行体不要求严格的缩进,但是为了美观,一般都会缩进,如下为伪代码所示 <?php while ($a == $b){ //循环执行的代码 } 可以使用关键词break退出循环,也可以使用continue跳过循环过程中的某一步,如下代码所示 <?php $i = 1; while ($i < 10) { $i += 1; //非双数时跳过输出 if ($i % 2 > 0) { continue; } //输出双数2、4、6、8 print_r($i); //当条件为8时候退出循环 if ($i == 8) { break; } }

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

Cglib 和 Mica Bean copy 生成字节码对比

1. 前言 距离上上篇【mica cglib 增强——【01】cglib bean copy 介绍】 已经过去一个月八一天。 距离上一篇【Java Bean Copy 性能大比拼】 已过去一个月零一天。 督促自己早日完成整个系列的文章,今天我将带领大家从字节码的层面来分析。 注:对于java 字节码感兴趣的朋友也可以阅读 《Java虚拟机规范》,Oracle 官方也有英文原版的 pdf可供下载。 2. Bean 模型 我们列举2个模型 User 和 UserVo,注意:birthday 字段类型不一样(敲黑板)。 2.1 User @Data public class User { private Integer id; private String name; private Integer age; private LocalDateTime birthday; } 2.2 UserVo @Data public class UserVo { private String name; private Integer age; private String birthday; } 3. Cglib Bean copy 字节码分析 3.1 配置 Cglib debug 模式 在第一篇【mica cglib 增强——【01】cglib bean copy 介绍】我们提到可以设置 cglib 源码生成目录。 // 设置 cglib 源码生成目录 String sourcePath = "/Users/lcm/git/mica/mica-example/web-example/src/test/java"; System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, sourcePath); 3.2 Bean copy 时生成的字节码 不使用类型转换时 Bean copy 的代码如下: // 1. 初始化 user,赋值 User user = new User(); user.setId(250); user.setName("如梦技术"); user.setAge(30); user.setBirthday(LocalDateTime.now()); // 2. 初始化 userVo UserVo userVo = new UserVo(); // 3. 构造 BeanCopier,不是用类型转换 BeanCopier copier = BeanCopier.create(User.class, UserVo.class, false); // 4. 拷贝对象,不是用类型转换,转换器可以使用 null copier.copy(user, userVo, null); // 5. 打印结果:UserVo(name=如梦技术, age=30, birthday=null) System.out.println(userVo); 生成的字节码: package org.springframework.cglib.empty; import net.dreamlu.test.User; import net.dreamlu.test.UserVo; import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.core.Converter; public class Object $$ BeanCopierByCGLIB $$ 70f9539b extends BeanCopier { public Object $$ BeanCopierByCGLIB $$ 70f9539b() { } public void copy(Object var1, Object var2, Converter var3) { UserVo var10000 = (UserVo)var2; User var10001 = (User)var1; var10000.setAge(((User)var1).getAge()); var10000.setName(var10001.getName()); } } 注意: 由于 birthday 字段类型不一样,没有生成 set方法。 使用类型转换时 Bean copy 的代码如下: // 1. 初始化 user,赋值 User user = new User(); user.setId(250); user.setName("如梦技术"); user.setAge(30); user.setBirthday(LocalDateTime.now()); // 2. 初始化 userVo UserVo userVo = new UserVo(); // 3. 构造 BeanCopier,不是用类型转换 BeanCopier copier = BeanCopier.create(User.class, UserVo.class, true); // 4. 拷贝对象,不是用类型转换,转换器可以使用 null copier.copy(user, userVo, new Converter() { @Override public Object convert(Object o, Class aClass, Object o1) { if (o == null) { return null; } // 直接使用 mica 中的类型转换工具 return ConvertUtil.convert(o, aClass); } }); // 5. 打印结果:UserVo(name=如梦技术, age=30, birthday=19-4-30 下午9:45) System.out.println(userVo); 生成的字节码: package org.springframework.cglib.empty; import net.dreamlu.test.User; import net.dreamlu.test.UserVo; import org.springframework.cglib.beans.BeanCopier; import org.springframework.cglib.core.Converter; public class Object $$ BeanCopierByCGLIB $$ 70f9539a extends BeanCopier { private static final Class CGLIB$load_class$java$2Elang$2EInteger; private static final Class CGLIB$load_class$java$2Elang$2EString; public Object $$ BeanCopierByCGLIB $$ 70f9539a() { } public void copy(Object var1, Object var2, Converter var3) { UserVo var4 = (UserVo)var2; User var5 = (User)var1; var4.setAge((Integer)var3.convert(var5.getAge(), CGLIB$load_class$java$2Elang$2EInteger, "setAge")); var4.setBirthday((String)var3.convert(var5.getBirthday(), CGLIB$load_class$java$2Elang$2EString, "setBirthday")); var4.setName((String)var3.convert(var5.getName(), CGLIB$load_class$java$2Elang$2EString, "setName")); } static void CGLIB$STATICHOOK1() { CGLIB$load_class$java$2Elang$2EInteger = Class.forName("java.lang.Integer"); CGLIB$load_class$java$2Elang$2EString = Class.forName("java.lang.String"); } static { CGLIB$STATICHOOK1(); } } 注意: 使用类型转换后生成了 birthday 的 set,仔细观察可以看到使用了类型转换之后生成的字节码都走了类型转换的逻辑。 4 Mica Bean copy的字节码 由于 Mica 的 Bean copy 是基于 Cglib 进行的增强查看字节码的方式和Cglib一样,设置的方式也和上面一样。 4.1 不使用类型转换 Bean copy 的代码如下: // 1. 初始化 user,赋值 User user = new User(); user.setId(250); user.setName("如梦技术"); user.setAge(30); user.setBirthday(LocalDateTime.now()); // 2. 使用 mica 的 BeanUtil copy 方法 UserVo userVo = BeanUtil.copy(user, UserVo.class); // 3. 打印结果:UserVo(name=如梦技术, age=30, birthday=null) System.out.println(userVo); 生成的字节码: package org.springframework.cglib.empty; import net.dreamlu.mica.core.beans.MicaBeanCopier; import net.dreamlu.test.User; import net.dreamlu.test.UserVo; import org.springframework.cglib.core.Converter; public class Object $$ MicaBeanCopierByCGLIB $$ aa75e50d extends MicaBeanCopier { public Object $$ MicaBeanCopierByCGLIB $$ aa75e50d() { } public void copy(Object var1, Object var2, Converter var3) { UserVo var4 = (UserVo)var2; User var5 = (User)var1; var4.setAge(var5.getAge()); var4.setName(var5.getName()); } } 注意: 不使用类型转换时生成的字节码同 Cglib 一致,只是使用更加简单一些。 4.2 使用类型转换时 Bean copy 的代码如下: // 1. 初始化 user,赋值 User user = new User(); user.setId(250); user.setName("如梦技术"); user.setAge(30); user.setBirthday(LocalDateTime.now()); // 2. 使用 mica 的 BeanUtil copyWithConvert 方法 UserVo userVo = BeanUtil.copyWithConvert(user, UserVo.class); // 3. 打印结果:UserVo(name=如梦技术, age=30, birthday=19-4-30 下午10:04) System.out.println(userVo); 生成的字节码: package org.springframework.cglib.empty; import net.dreamlu.mica.core.beans.MicaBeanCopier; import net.dreamlu.test.User; import net.dreamlu.test.UserVo; import org.springframework.cglib.core.Converter; public class Object $$ MicaBeanCopierByCGLIB $$ aa75e0e7 extends MicaBeanCopier { private static final Class CGLIB$load_class$java$2Elang$2EString; public Object $$ MicaBeanCopierByCGLIB $$ aa75e0e7() { } public void copy(Object var1, Object var2, Converter var3) { UserVo var4 = (UserVo)var2; User var5 = (User)var1; var4.setAge(var5.getAge()); var4.setBirthday((String)var3.convert(var5.getBirthday(), CGLIB$load_class$java$2Elang$2EString, "birthday")); var4.setName(var5.getName()); } static void CGLIB$STATICHOOK1() { CGLIB$load_class$java$2Elang$2EString = Class.forName("java.lang.String"); } static { CGLIB$STATICHOOK1(); } } 注意: 可以看到 Mica 中对生成的字节码进行了优化,对类型相同的拷贝不使用类型转换。 总结 在 Mica 中笔者对 Bean Copy 进行了大量的优化,包括类型转换优化,链式Bean支持,Map支持等,敢兴趣的朋友可以试用哦。 相关链接 示例项目:https://github.com/lets-mica/mica-example mica 源码 Github:https://github.com/lets-mica mica 源码 Gitee(码云):https://gitee.com/596392912/mica 文档地址(官网):https://www.dreamlu.net/docs/ 文档地址(语雀-可关注订阅):https://www.yuque.com/dreamlu/mica 开源推荐 Avue 一款基于vue可配置化的神奇框架:https://gitee.com/smallweigit/avue pig 宇宙最强微服务(架构师必备):https://gitee.com/log4j/pig SpringBlade 完整的线上解决方案(企业开发必备):https://gitee.com/smallc/SpringBlade IJPay 支付SDK让支付触手可及:https://gitee.com/javen205/IJPay

资源下载

更多资源
Mario

Mario

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册