zoukankan      html  css  js  c++  java
  • python 转化为PHP代码过程中遇到的问题

    1.字符串中的% 问题

     sql= "select system_type from index_data_set where id='%s'" % (data_id)

    转化为PHP

    $sql = sprintf("select system_type from index_data_set where id='%s'", strval($data_id));

    字符串中的%,这是一个几乎所有语言中都通用的一类字符串操作,所以如果你的教材默认了你有其他编程语言基础的话,可能就不会详细介绍了。

    简单的说,这是一种将其他变量置入字符串特定位置以生成新字符串的操作,比如说:

    n = "Aki"
    "My name is %s" % n
    

    这段代码首先定义了一个名为n的变量,内容为Aki。然后下方的字符串中有一个%s,他的含义是“这里将被替换成一个新的字符串”,用作替换的内容放在字符串后面的%后面,就是那个n。所以最终这个字符串会变成My name is Aki。
    字符串中的%后面会附带一个字母,代表着用来替换的变量的类型,比如说%d代表着你将替换到此处的变量是一个整数,而%s代表着一个字符串。详细细节可在这里看到。
    https://docs.python.org/2/library/stdtypes.html#string-formatting-operations

    另外,这种操作可以同时将多个变量放进字符串,只需要用括号把变量们括起来。

    下面是一些例子。

    >>> "www.%s.com"%"zhihu"#字符串
    'www.zhihu.com'
    
    >>> "%dkm"%1990#整数型
    '1990km'
    
    >>> "%s %d %f"%("abc",123,3.21)#多个值
    'abc 123 3.210000'

    2. 大家是如何理解Python中的self?

    如果你知道java或者javascript中的this,那么self的作用和他们是一样的,不过我猜你可能也没接触过这两门语言。

    为了说清楚 self 是个什么东西,你首选需要搞清实例与类之间的关系

    人就是一种类,人有名字,身高,体重等属性,不同人这些属性都是不一样的,除此之外,人还有很多方法(功能),例如,思考、跑步、睡觉等等。

    class Person:
        def __init__(self, name):
            self.name = name
    
        def think(self):
            print("{} is thinking".format(self.name))

    具体到每一个人,例如你自己,你身边的每一个具体的人,都是「人类」的实例对象,例如:

    lisi = Person("lisi")

    我构造了一个叫"lisi"的人,它是Person的实例对象,我们给Person定义了一个think方法,但是需要一个参数,我们可以把 lisi 这个实例对象传递过去。

    >>> Person.think(lisi)
    lisi is thinking

    所以,这里的 self 其实就是函数 think 的一个普通参数而是,那为什么要叫self呢?其实这是约定俗成的,你叫其他名字也没关系,不过通常不这么做,就好比我们平常交流都是用普通话,突然冒出一句洋文,别人不一定能听懂。

    那为什么我们平常调用 think 方法的时候不是这样调用,而是直接用 「实例.方法」的形式调用呢?

    >>> Person.think
    <function Person.think at 0x110e4f510>
    
    >>> lisi.think
    <bound method Person.think of <__main__.Person object at 0x10f3a09b0>>

    前者是一个在 Person 中的普通函数,后者是被绑定了的方法,该方法与当前实例对象进行了绑定,意味着 调用 lisi.think 时不再需要传递参数,因为已经将lisi进行的绑定,调用的时候,python会自动把lisi作为参数传递过去。也就是说,调用的时候,会把当前对象自己传递过去。

    >>> lisi.think()
    lisi is thinking
    >>> 

    以上就是self的概念

    https://www.zhihu.com/question/39264541

    3.python 中fetchone()和fetchall()

    * fetchone() :

        返回单个的元组,也就是一条记录(row),如果没有结果 , 则返回 None

        cu.execute("select user,password from user where user='%s'" %name)
        arr= cur.fetchone()   ----此时 通过 arr[0],arr[1]可以依次访问user,password

    * fetchall() :

       返回多个元组,即返回多条记录(rows),如果没有结果,则返回 ()

       cur.execute("select * from user")

    ***注意:在MySQL中是null,而在Python中则是None

    ①查询出有多条数据时:

    cursor.fetchone():将只取最上面的第一条结果,返回单个元组如('id','name'),然后多次循环使用cursor.fetchone(),依次取得下一条结果,直到为空。

    cursor.fetchall() :将返回所有结果,返回二维元组,如(('id','name'),('id','name')),

    ②查询只有一条数据时:

    cursor.fetchone():将只返回一条结果,返回单个元组如('id','name')。

    cursor.fetchall() :也将返回所有结果,返回二维元组,如(('id','name'),),

    PHP替换为,例子

    $sql = sprintf("select * from user where id='%s'", strval($data_id));
    		$ret = mysqli_query($sql);
    		if (!empty($ret)){
    			$val = mysqli_fetch_array($ret, MYSQLI_ASSOC);
    			return $val;
    		}
    		return [];

    4.# 过滤html标签

     # 过滤html标签
        def filterHtmlTags(self, string) :
            pat = re.compile('<[^>]+>')
            return pat.sub('', string)
        pass

    平时用我们使用htmlspecialchars() 来过滤html, 但是把html的字符转义了,最后显示出来的就是html源代码.

    利用strip_tags()就可以把html标签去除掉.

    <?php
    $str = '<a href="#">href</a>';
    //echo htmlspecialchars($str);
    echo strip_tags($str);

    5 python 中NONE

    为什么我们要用is None

    好像我们来看None在python是一个怎样的存在:

    1. None有自己的数据类型NontType,你可以将None赋值给任意对象,但是不能创建一个NoneType对象。
    >>> type(None)
    <class 'NoneType'>
    >>> n=NoneType()
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    NameError: name 'NoneType' is not defined
    
    1. None是python中的一个特殊的常量,表示一个空的对象,空值是python中的一个特殊值。数据为空并不代表是空对象,例如[],’'等都不是None。None和任何对象比较返回值都是False,除了自己。
    >>> L=[]
    >>> L is None
    False
    >>> L=''
    >>> L is None
    False
    

    下面会到我们的问题,为什么要用is None?

    因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。

    >>> a=None
    >>> b=None
    >>> id(a)==id(b)
    True
    >>> id(None)
    1522470008
    >>> id(a)
    1522470008
    >>> a == None
    True
    >>> a is None
    True
    

    is None是判断两个对象在内存中的地址是否一致,== None背后调用的是eq,而eq可以被重载,下面是一个 is not None但 == None的例子:

    >>> class test():
    ...     def __eq__(self,other):
    ...         return True
    ... 
    >>> t=test()
    >>> t is None
    False
    >>> t == None
    True
    

    关于None,就算你知道了应该使用is 来判断是否为None还有另一个坑,就是这个判断怎么写的问题,这个坑会用到这篇博客Python中的True和False与bool()函数吗?中的一些知识,不懂的话,可以去参考这篇博客,下面我们来看一下这个坑有多深。
    在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False ,即:

    not None == not False == not '' == not 0 == not [] == not {} == not ()
    

    因此在使用列表的时候,如果你想区分x==[]和x==None两种情况的话, 此时if not x:将会出现问题:

    >>> x = []
    >>> y = None
    >>> 
    >>> x is None
    False
    >>> y is None
    True
    >>> not x
    True
    >>> not y
    True
    >>> not x is None #相当于not (x is None)
    >>> True
    >>> not y is None
    False
    

    如果not x 你是想判断x是否为None,但是这样写会把x==[]的情况也包含进来了,这么无法区分两种情况。下面的not x is None是正确的,却不是很好理解,其意思是not (x is None), 最好的写法是 if x is not None,即清晰又不会出现问题。
    所以在使用if not x的时候,一定要考虑清楚,必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行

    参考;https://blog.csdn.net/u014234260/article/details/79581041

  • 相关阅读:
    Lua如何管理”package”
    Lua: 好的, 坏的, 和坑爹的
    Lua中metatable和__index的联系
    Lua5.3 注册表 _G _ENV
    采访 Lua 发明人的一篇文章
    Lua的函数调用和协程中,栈的变化情况
    理解 Lua 的那些坑爹特性
    高性能 Lua 技巧(译)
    LLVM每日谈21 一些编译器和LLVM/Clang代码
    上Https 和 http 差分
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15452440.html
Copyright © 2011-2022 走看看