zoukankan      html  css  js  c++  java
  • Python手记(二)

    1.map函数

      map函数用于将指定的数据成员都使用指定函数进行处理。
      比如:

    1 map(float, arr)
    2 map(square, arr)

      这两个函数分别将arr中成员转换为float类型,以及对于arr中成员求平方。
      还可以通过lamba函数来进行指定匿名函数:

    1 map(lambda x: x ** 2, [1, 2, 3, 4, 5])
    2 map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])

      但是注意map函数在python2中返回的是List(原生数组),但是在python3中返回的则是一个迭代器。对于迭代器只能使用for语句进行迭代获取:

    1 arr = [1,2,3,4,5]
    2 arr = map(square, arr)
    3 print(arr)
    4 for item in arr:
    5     print(item)
    >><map object at 0x000000000A396278>
    >>1 4 9 16 25

     2 frozenset的强大

      frozenset修饰过的list奖会不会被修改,同时会给你排序,还会把重复的元素给删掉;当然set处理过的list也是会把数据删掉,并且会排序
    3. python默认返回值是None
      之前调用tree的一个方法disp()总是返回none,我是百思不得其解
     1 class treeNode:
     2     def __init__(self, nameValue, numOccur, parentNode):
     3         self.name = nameValue
     4         self.count = numOccur
     5         self.parent = parentNode # 上级树信息
     6         self.children = {} # 下级(树枝)树信息
     7         self.nodeLink = None
     8     def inc(self, numOccur):
     9         self.count += numOccur
    10     
    11     def disp(self, ind=1):
    12         print ('  '*ind, "name: %s, count: %d" %(self.name, self.count))
    13         for child in self.children.values():
    14             child.disp(ind + 1)
      调用:
     print(" 元素:%s没有在树中...为树创建子节点: %s" % (items[0], newTreeNode.disp())) 
      这个print总是会输出:
    元素:z没有在树中...为树创建子节点: None
      None从哪里来的?
    想了好久,才想明白,disp这个函数本身是没有返回值的,然而在print中调用改函数本意希望返回一个打印的字符串;但是disp其实是在函数体内部完成了打印,但是并没与把打印内容输出出来。
    而python默认的返回值是None;所以你强取返回值获取的就是None;
      可以这么讲:disp正确的用法不是在print里面,而是应该单独使用。
    4.Python中数组双冒号
    Python中数组多冒号(:)的问题:[start:end:step],step代表的是步长,很多时候省略start,默认从0开始,省略step默认是1.例如:
     arr=[0,1,2,3,4,5,6,7,8,9] arr[0:10:2] 
    输出为:
     [0, 2, 4, 6, 8] 
    如果步长为负值,则代表要根据当前顺序做逆序排列。然后再取值,例如:
     arr=[0,1,2,3,4,5,6,7,8,9] arr[:5:-1] 
      输出为:
     [9, 8, 7, 6] 
     5. juypter的“未连接至服务”
    jupyter notebook可以正常进入到网页,但是发现连不上python3的服务,提示为“未连接至服务”;后来网调发现时因为Juypter里面有个组件tornado版本问题,需要降到5.1.1(之前是6.x),之后juypter可以正常使用。
    6. 自定义类和包
      自定义的包下面需要有__init__.py的文件(为空无所谓)
      在引用的文件中要添加该包的引用路径(包文件所在的父文件夹),例如根目录下创建了一个包,那么需要:
    1 import os, sys
    2 sys.path.append(os.path.abspath("."))

       这里又要给概念,就是包(文件夹),模块(py文件),类(py文件中当以的代码段,通过class关键声明包裹)三者关系。

      这里有一个概念要澄清一下,模块其实就相当于Java里面的全局static类,如果里面有变量的话是共享的;如果你需要具有一定的封装性,希望调用方有自己的处理单元,需要定义一个类,因为是通过new获取的处理单元,所以不会有数据共享的问题。

     7. 关于from和import
      这个需要持续关注,先说一点测试通过的内容
      from A import B和 import A.B的差别在于:前者可以直接使用B,而后者必须要全路径引用;
      另外,import后面跟的至少是要模块,如果是包名称(对应__init__.py文件),在代码中引用将会导致问题。比如:
    1 import sklearn
    2 a=sklearn.datasets.load_digits()

       将会报错:AttributeError: module 'sklearn' has no attribute 'datasets'

      这个是因为如果跟代码跟进sklearn,起始对应的是sklearn包下面的__init__.py文件,这个import是不允许的。

      但是在单步执行的情况下,只有一个地方曾经执行过"import sklearn.datasets",那么这个地方就不会报错;因为在IPython机制下,代码是整个执行过程共享的;需要通过“ctrl+Z”退出当前环境,从新敲“python”进入到IPython的环境,再来执行才会继续报错。

  • 相关阅读:
    docker 日常使用笔记
    docker swarm:启动多个 overlay网络出现 could not find an available IP while allocating VIP问题
    docker 容器启动失败:Could not attach to network
    fabric : orderer启动失败
    git 代码迁移
    Docker 远程访问
    Struts2标签
    BS与CS的联系与区别
    Java的引用和C++的指针de区别
    抽象类和接口的区别
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/10507263.html
Copyright © 2011-2022 走看看