前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++程序员Python notes

C++程序员Python notes

作者头像
py3study
发布2020-01-14 15:10:49
3240
发布2020-01-14 15:10:49
举报
文章被收录于专栏:python3python3

参考http://blog.chinaunix.net/uid/20039893/frmd/49956.html及其他一些网上资料,C++程序员的Python入门

1. important getchas:     judge whether a object is a type     type(object) == type(str())     或     from types import StringTypes     type(object) == types.StringType    #记得要import types     或if isinstance(obj, StringTypes):     与系统定义的单值比较尽量使用is,虽然使用==能使用同样功能但效率差许多,因为一个是直接比较一个需要调用其比较函数,老外曾经测试过。如if x is None,if x is not None,不要if x == None。is的非形式为is not。     所有的控制语句需要用':'换行,定义函数同样,切记,Python中的一切都是对象,包括函数。     尽量使用xrange代替range,range直接生成指定大小的list,而xrange只是生成一个对象而在需要时才产生下一个值,这可以节省非常多的内存,对于足够大的值使用range可能造成内存不足。     编码规范:类名首字母大写,e.g. ,Dog,变量和函数名__开头为私有,尽量只将函数暴露给外部,变量命名小写加_即可,同Linux。某些时候和系统的命名冲突可以_结尾,如_china_。 http://www.cnblogs.com/kym/archive/2011/03/17/1986640.html

2. itertools模块对迭代和组合非常有效,比如     import itertools     iter = itertools.permutations([1, 2, 3])     lst = list(iter)    #此时lst为[1, 2, 3]的全排列

3. 数组即list,下标中的冒号表示到XX为止或以XX开始     string中单个item是不可修改的,故不可使用str_test[5] = 'm'来修改一个字节     正确的方式是str_test = str_test[4:] + 'm' + str_test[:6]     但这种方法会多次拷贝字符串造成效率较低,故较好的方法是先用list存储之后再转     其长度并非list.len而是len(list)

4. sequence类型的slice详解,比如string、list、tuple     1)+不能用来连接一个字符串和数字,因为其也数字加法运算符     2)[1:4:2]除起始两个值代表起始和结束位置外,最后一个代表步进值

5. Python数据类型分类     number     sequence: string(不可变)、list、tuple(不可变)     mapping: dictionary,类似stl中的map     可变和不可变类似于c++中的const,即一旦定义后不许改变其值。     number支持各种算术运算。     string是顺序的,不可变的。     list是顺序的,可变的。     dictrionary是无顺序的,可变的     tuple是顺序的,不可变的。     str() list() dict() tuple()这几内置函数分别用于构造相应的类型。

6. list     特点:有序、可变     可直接使用list将序列构造一个list,如:test_list = list('china')     修改时可直接以slice为单位,且不要求被替换的内容与新内容长度相同,故修改后可能list的长度会改变,如:test_list[4:6] = ['n', 'a', 'm', 'mddd']或test_list[4:] = ['e']     注意list中的count并非其中的元素个数,而是给定的value在list中出现的次数     其他如下:

  1. >>> L.append(4)  #只能一次添加一个object,不能用于两个sequence连接,因为新sequence将会被作为一个object添加进去
  2. >>> L
  3.     [0, 1, 2, 3, 4]
  4. >>> L.extend([5, 6])  #参数为一个sequence,直接添加到其末尾
  5. >>> L
  6.     [0, 1, 2, 3, 4, 5, 6]
  7. >>> L = L + [7]  #可为sequence或object,与前面的区别是会新构造一个对象,故需要重新赋值,至于+=是否会被当作append或extend处理目前并未有相关资料,如果作者有注意到的话应该会做此类优化
  8. >>> L
  9.     [0, 1, 2, 3, 4, 5, 6, 7]

7. dictionary     初始化方式为test_dic = {1:'one', 2:'two}     可以使用items()导出到list, test_list = test_dic.items(),将会得到一个类似[(1, 'one'), (2, 'two')]的list。     可以使用fromkeys()从list导入key,value将以None填充,如:     test_list = [1, 2, 3, 4]     test_dic.fromkeys(test_list)     for x in test_dic会遍历test_dic,默认遍历key,使用test_dic的iterkeys()、itervalues()、iteritems()可以分别得到遍历key、value和item的iterator。

8. tuple     test_tuple = (1, 3, 4)     可将tuple理解成const的list,但其成员的成员是可变,即其某一位置必须指向某一对象不可再指向另一对象,但该对象本身是可变的。     注意当只有一个初始成员时需要在初始化末尾加',',如:     test_tuple = (1, )     否则将会被初始化为整型。

9. 查找一个值是否在容器中要用in而不是用index然后去检查其返回值是不是>0...

10. print a, b, c,    print会自动在每个变量后加一个空格,最后以逗号结尾可以防止调用print结束会自动附加的\n换行符     print >> object, x, y    将x,y出到object的write方法中,该ojbect必须有些方法哦     Python中print为以下语句的简写     import sys     sys.stdout.write(str(x) + '\n')     故可通过将stdout重定向而实现print的输出重定向功能     import sys     fp = file('log.txt', 'a')     sys.stdout = fp     print 'hello world! heihei'     sys.stdout = sys.__stdout__    # reset to default

11. 语句和语法     Python要写超过一行的语句,需要一对符号的语句或者在前一行后加上'\',与C相同,第二种不推荐,因为任何第二种的情况都可使用()来代替     Python中的switch/case可用多个if/elif/else代替,或者个人感觉可以使用dictionary结合lambda表达式,如:     choice = 'inc'     g = {'inc' : lambda x: x + 1,      'dec' : lambda x: x - 1}     g[choice](x)     Python中的while和for都可带else子句,注意break是不会跳到else中的,只有循环的判断表达式为False方可。

12. map(function, seq1, seq2, ...) 对seq列表中的所有的的seq每项依次调用function,将其返回值构建列表,如果functon为None则直接返回seq中的值     map(lambda x, y: y / x, time, ratio)    #每个时刻点的平均ratio

13. zip就是把2个数组糅在一起 x=[1, 2, 3, 4, 5 ] y=[6, 7, 8, 9, 10] zip(x, y)就得到了 [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)] 比如你有2组坐标,你想两两对应的相加,那么zip函数就很有用了。 再比如,你有2个数组A,B,A存了班级里的人的名字,B是每个人的考试分数,你需要通过某个人的名字来查考试分数,那你需要一个字典,zip可以很方便地帮你建立字典: >>> x=['bob','tom','kitty'] >>> y=[80,90,95] >>>d=dict(zip(x,y)) [('bob', 80), ('tom', 90), ('kitty', 95)] >>> d['bob'] 返回80,多方便啊

14. 在Python中所有的都是对象,函数也不例外。     def定义一个函数对象,定义的对象可赋值,lambda函数同理。

  1. if x ==0:
  2.     def npower(n): x**2
  3. else:
  4.     def npower(n): x**3
  5. nload = npower
  6. nload(5)
  7. L = [npower, nload]

15. 命名空间 第一,赋值(包括显式赋值和隐式赋值)产生标识符,赋值的地点决定标识符所处的命名空间。 第二,函数定义(包括def和lambda)产生新的命名空间。 第三,python搜索一个标识符的顺序是"LEGB"。 所谓的"LEGB"是python中四层命名空间的英文名字首字母的缩写。最里面的一层是L(local),表示在一个函数定义中,而且在这个函数里面没有再包含函数的定义。第二层E(enclosing function),表示在一个函数定义中,但这个函数里面还包含有函数的定义,其实L层和E层只是相对的。第三层G(global),是指一个模块的命名空间,也就是说在一个.py文件中定义的标识符,但不在一个函数中。第四层B(builtin),是指python解释器启动时就已经具有的命名空间,之所以叫builtin是因为在python解释器启动时会自动载入__builtin__模块,这个模块中的list、str等内置函数的就处于B层的命名空间中。 其实只要在编程的时候注意一下,不要使用相同的标识符,基本上就可以避免任何与命名空间相关的问题。还有就是在一个函数中尽量不要使用上层命名空间中的标识符,如果一定要用,也最好使用参数传递的方式进行,这样有利于保持函数的独立性。

16. 函数传参方式 关键字赋值法:不像C/C++,形参的顺序是可根据传参顺序改变,如:F(arg2 = 2, arg1 = 1) F(arg1,arg2,...) F(arg2=<value>,arg3=<value>...)    #带默认值的函数定义,如果需要用到默认值的参数在前面,则使用关键字赋值法 F(*arg1)    #参数不管多少个都被存放在以形参名为标识符的tuple中 F(**arg1)    #参数不管多少个都被存放在以形参名为标识符的dictionary中,调用时需要采用F(x = 1, y = 2)类似的形式, 则arg1 = {('x' : 1), ('y' : 2)}

17. lambda函数 与C++不同,lambda在Python中只能是一行,可以使用';',但不能使用for/while/if,虽然使用某些技巧可以实现但不推荐,系统自带的map/reduce/filter等函数比较好用。 lambda x, y: x + y; print x, y; x + y + 1

18. 类相关 __init__(self)    类的构造函数,如果传参可写为__init__(self, arg1, arg2...),类似于c++中的bind。 __del__(self)    类的析构函数 __call__(self, arg1, ...)  类似于C++中的重载括号运算符 类中的权限完全根据_和__来区分,即直接命名的为public函数 派生类需要手动调用基类的__init__,否则继承将不起作用

class Animal(object):
    name = 'unname' # member varieble
    def __init__(self, voice = 'hello', name = 'default'):
        self.voice = voice
        print 'animal::__init__, name: ', name
    def __call__(self, voice)
        self.voice = voice
    def say(self):
        print self.voice
        print self.name
class Dog(Animal):
    def __init__(self):
        #Animal.__init__(self)    # 手动调用
        super(Dog, self).__init__()    #代替上面的写法
        self.dogName = 'dogName'
Dog d
d('wangwang')    # invoke __call__
d.say()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档