月度归档:2018年09月

python处理UTF-8文件的BOM头

问题

用requests库下载一个xml文件,结果 return response.content 的时候发现返回的文本是这样的

b'\xef\xbb\xbf<?xxxxxxxxxx

前面有b’\xef\xbb\xbf
写入文件的时候就有问题了
查了一下EF BB BF是被称为 Byte order mark (BOM)的文件标记,用来指出这个文件是UTF-8编码
在Stack Overflow上面搜到一个类似的问题
https://stackoverflow.com/questions/13590749/reading-unicode-file-data-with-bom-chars-in-python

解决方案

>>> b'\xef\xbb\xbfhello'.decode('utf-8-sig')
'hello'

LeetCode 7 反转整数

题目

给定一个 32 位有符号整数,将整数中的数字进行反转。

代码

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x >= 0:
            y = int(str(x)[::-1])
        elif x < 0:
            y =  -int(str(-x)[::-1])
        return y if y < 2147483648 and y > -2147483648 else 0

思路

LeetCode 9 回文数

题目

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

代码

class Solution:
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        if x < 0:
            return False
        else:
            y = str(x)[::-1]

        if str(x) == y:
            return True
        else:
            return False

思路

将数字转换为字符串然后切片 生成新的字符串
先判断 if x < 0 返回 false 可以提高效率

LeetCode 1 两数之和

题目

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

代码

def twoSum(nums, target):
    """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
    #         for i in range(len(nums)-1):
    #             for j in range(i+1,len(nums)):
    #                 if nums[i] + nums[j] == target:
    #                     return [i,j]
    dic = {}
    for i, num in enumerate(nums):
        print(nums)
        if num in dic:
            print('----')
            print([dic[num], i])
            print('----')
        else:
            dic[target - num] = i
            print(dic)

twoSum([1,3,5], 8)

原理解析:

将目标值t与当前遍历的元素num做差,将差值和num的索引值i存入字典dic,
当取到下一个num值时,先检查num 有没有在dic中,
如果存在,说明已经找到了两个num 满足相加等于t的条件(a+b=c => a=c-b)
然后返回当前num的索引值和之前存入字典的索引值

vscode使用pipenv虚拟环境的解释器

查看当前pipenv环境的python解释器的绝对路径:

$ pipenv --py
C:UsersAdministrator.virtualenvshttpbin-HCxJgMvtScriptspython.exe

打开设置 在工作区设置中添加如下配置:

{
"python.pythonPath": "C:/Users/Administrator/.virtualenvs/httpbin-HCxJgMvt/Scripts/python.exe",
"python.linting.pylintEnabled": false
}

python.pythonPath 填写 第一步执行命令输出的路径
然后就可以在vscode中右键 选择 在终端中执行python文件啦

二分法查找

检查长度为n的列表,二分查找需要进行log n 次操作,使用大O表示法即O(log n)

def binary_search(list, item):
    """
    二分查找
    :param list:
    :param item:
    :return:
    """
    low = 0
    high = len(list) - 1

    while low <= high:
        mid = int((low + high) / 2)
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None


list = [1, 3, 5, 7, 9, 12]

print(binary_search(list, 12))

git常用命令学习笔记

初始化git仓库

git init

把文件添加进版本库

git add 1.txt

把文件提交到版本库

git commit -m 'add 1.txt'

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支

继续阅读

pycookbook-数据结构

解压序列赋值给多个变量

In [32]: b = ['qwe','asd']

In [33]: q,a = b

In [34]: a
Out[34]: 'asd'

In [35]: q
Out[35]: 'qwe'

如果变量数跟序列元素数不一致,会出现异常

In [36]: q,a,z = b
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-36-5bedc90bd5b2> in <module>()
----> 1 q,a,z = b

ValueError: not enough values to unpack (expected 3, got 2)

继续阅读

python里面如何拷贝一个对象

  • 赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个;
  • 浅拷贝(copy.copy()),创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另一个也会被改变);

  • 深拷贝(copy.deepcopy()),创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另一个不会改变)

继续阅读