Python Learning

1、查看mac系统自带的python版本

终端敲入命令 python -V(大写)

我mac目前显示的 Python 3.6.4

2、教程提示需要安装最新3.7版本的Python,并且用homebrew安装更为方便快捷

首先我查看电脑上是否已经安装了homebrew  这是一个非常方便mac下载各种包的包管理器

Homebrew installs the stuff you need the apple didn't

由于教程中说的是如果mac上的python版本是2.7 那在命令行敲 brew install python3 就可以成功安装

但由于我的mac上的python版本已经是3了,所以我要去官网下载安装

因为在国外所以下载速度很快,按照提示一步步install就可以

3、查看下载好的IDE pycharm 发现新建的项目的默认解释器(interpreter)是python2.7 version提供的

在pycharm -> preferences -> project interpreter 中增加 python 3.7 version 即可

4、用homebrew下载mongodb 

在mongodb的官网上可以很清楚地了解整个下载的过程 shell输入命令 brew install mongodb

下载好之后,可发现包在mac上的路径为  /usr/local/Cellar/mongodb

在运行mongodb的时候出现错误,解决办法参考这篇博客 

Failed to set up listener: SocketException: Address already in use

遇到了一个问题,不太记得进程的【ID和port】之间的区别 

如果要关掉 Mongodb 直接在终端界面上 ctrl+c 即可

5、启动mongodb

刚开始还不知道要怎么弄,用 mongodb 启动的时候总是报端口被占用的exception

后面找到进程kill就好

kill PID

连接成功后会出现

接着重新开一个终端,敲入命令与对应端口号的db进行连接,就可以开始操作 mongodb 了

mongo --host 127.0.0.1:27017

9月8日学习内容

学习了一些Python的基础语法和知识

比如编码规则 UTF-8

还有可变对象数组 list 和不可变对象数组 tuple

一些简单的 while循环和 if else语句的编码规范

了解了一种在python中非常常见的key-value键值对的存储方式(dict)

dict查找速度很快,用空间换时间

还有set集合,set与dict相似,不同于没有value只有key值而已

dict和set的key值都必须是不可变对象,python中常见的有str和整数

dict和set中都不能将list作为某一个对象,但是可以用tuple, 因为一个是可变对象一个是不可变对象

s1=set((1,2.3)) 是ok的

而 s1=set((1,2,[1,2,3]))则会抛出异常

dict和set当中的value都是无序且独一无二的

dict  {}

set()  集合之间可以进行 交集 & 和并集 | 运算

tuple () 当只有一个对象在其中的时候 用(1,)声明,也就是要加一个逗号表示,从而与(1)区分

list[]

9月9日

查看Python 内置的函数,函数名即可直接调用

今天学习了函数的相关东西

除了了解熟悉python内置的一些函数之外,还知道了 import math 包之后可以用里面的很多数学计算公式,还是比较方便的

之外,学习了如何定义函数,这里比较重要的是函数的参数

函数一共有五类参数,定义的顺序必须是

1、必选参数

2、默认参数:设置为 str 或者 none 这类不变对象

3、可变参数   *args

4、命名关键字参数   (name, age, *, city,  jod)* 后面的 city 和 job 是命名关键字参数

5、关键字参数  **kw

最后学习的是递归函数,这类函数已经是非常基础和常见的了。

python 写 hanio (汉诺塔)的代码真的简洁又好懂!

9月10日

今天import 包的时候报了一个warning

DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import Iterable

也就是说我用了一种已经被淘汰的表示方法

from collections import Iterable

但是不影响使用,不过3.8版本之后就会被淘汰了

正确的写法应该是

from collections.abc import Iterable

找到一个数组中最大值最小值的代码:用的迭代

9月10日

今天是教师节,在此祝天下所有的老师节日快乐!你们辛苦了!也祝乐于分享的廖雪峰老师节日快乐!跟着廖老师的博客学习到了很多!

今天很可惜没有学习完一整个部分,只学了切片、迭代和list生成式

切片是一个非常方便的用来取list或者tuple中某些特定元素的方法,当然对于字符串也是同样适用的,可以把一个字符串作为一个list,里面每一个字符就是list中的一个元素

而迭代就是循环啦,这个结构不用多说,是基础中的基础

list生成器是一个很神奇的东西,和其他实现相同功能的语言比较起来,python真的是简洁很多,理解性也比较强

 

下面这段是用来实现一个找出一个list当中的最大和最小值的函数代码

9月11日

我刚刚码的那么多字都不见了!生气

刚刚把 generator 和 iterator 学习完,内容比之前学的要稍微复杂一些

杨辉三角我用的是数学公式实现的,相比较依赖于上一步但是只需进行加法计算的方法,阶乘计算就略显复杂些了,但我暂时不深入研究那么多,等需要用的时候再去细细了解。

今天也明白了 iterable 和 iterator之间的区别和联系

iterable 的数据类型可以用在for循环中

iterator的对象可以用next()函数不断获取下一个数据,这是一种惰性计算。iterator包括generator和带yield的generator函数

9月12日

今天学习了一个神奇的filter()函数,可以根据作用在iterator的函数返回的布尔值是true or false 来创建一个新的序列,true则保留该值,false则丢弃那个值

今天第一次听说可以用 埃式筛法 来求得素数 primes

具体代码如下图所示

# 生成一个从3开始的奇数序列
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n


# 定义了一个筛选函数,x不能被n整除
def _not_divisible(n):
    return lambda x: x % n > 0


def primes():   # 惰性序列
    yield 2
    it = _odd_iter()    # it是一个生成器
    while True:
        n = next(it)
        yield n
        it = filter(_not_divisible(n), it)  # 筛选构造新序列


for n in primes():  # 这是一个无限循环,所以必须要有条件停下
    if n < 1000:
        print(n)
    else:
        break

解锁获得相反字符串方法!

n = 1238392108901
s = str(n)
print(s[:])
print(s[::2])   # 每两个字符取一个
print(s[::-1])  # 通过这种slice切片操作,可以得到与原字符串reverse的string

返回函数有点意思,但是也有点烧脑,反正就是调用一个函数的时候,不会得到一个确切的值,只会得到一个函数里面包含的函数,而这个函数是在后期调用的时候才会真正运行返回结果的,以下是部分代码

def lazy_sum(*args):    # 参数前面加了*表示为可变参数
    def sum_calculation():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum_calculation()


f = lazy_sum(1, 3, 4, 5)
f1 = lazy_sum(1, 3, 4, 5)
print(lazy_sum(1))
print(f1 == f)  # why the result is true? Just isn't consistent with the the result of blog
# print(f())


print('-------return function------')


def count():
    fs = []
    for i in range(1, 4):
        def inner_function():
            return i*i
        fs.append(inner_function)
    return fs


f2, f3, f4 = count()
# f2, f3, f4 分别对应fs这个list中的三个元素,也就是三个内部函数的地址
print(f2)
print(f2())

刚刚终于知道了lambda是匿名函数的意思,也是数学学习中一直没离开过的未知数...

L = list(filter(lambda x: x % 2 == 0, range(100)))
print(L)

Decorator看的我有点晕,不过让我想起了之前伟帅提起过的装饰模式

这个功能其实还是有很多适用场景的,如果需要在调用某个函数之前之后打印什么日志信息之类的

今日总结!

学习了以下内容,学习的速度要加快啦!

差不多都是函数方面的知识,感觉python确实很强大,很多功能的实现相比其他编程语言要简洁精炼很多,所以长路漫漫,加油学啦!fuctools这个模块今天看到很多次了,明天应该可以学习到,so exciting! 

关于偏函数的功能,这里简单介绍一下

functools.partial的作用:把一个function的某些参数给固定住,也就是设置默认值,可以得到一个新的函数,而这个function会更为简便地被使用

9月13日

今天时间比较紧凑,花了一些时间去计算氮化物的一些自发极化和压电极化大小,以及异质结的极化差大小

实践出真知这句话是没有错的

关于Python内置的一些module可能需要去看官方提供的文档好好了解一下

Python中表示private的函数用_作为前缀的函数名表示,它不应该被公开调用,而不是不能

在自己所写的程序中,规范的做法是将向外公开的函数作为public,而一些内部逻辑实现函数设置为private,从而可以体现出较好的封装性

# 当自定义的函数以_前缀命名的时候,这是一个被隐藏的private函数
# 所以在编写代码的时候只需要把对外的函数设置为public,而其他的
# 内部逻辑函数都设为private#


def _private_1(name):
    return 'Hello, %s' % name


def _private_2(name):
    return 'Hi, %s' % name


def greeting(name):
    if len(name) > 3:
        print(_private_1(name))
    else:
        print(_private_2(name))

9月15日

转眼20天就过去了,我的项目真的要抓紧时间了啊!冲鸭!加油!我一定可以的!

今天学习了Anaconda,它是一个基于Python的数据处理和科学计算的平台,嗯,听起来就很厉害的样子,Anaconda内置的很多非常有用的第三方库

因为我电脑不知道什么时候已经安装好了anaconda,但它指向的是系统内置的Python2.7,为了让Anaconda服务于Python3.7,我跟着官网上提供的步骤一步步进行操作

命令操作如下:

conda -V   #查看anaconda版本

conda update conda   #更新

conda create --name snakes python=3.7   #创造一个新的环境与不同的python版本联系起来

source activate snakes   #激活这个环境

conda info --envs   #查看环境信息

snakes为当前默认环境 There is a asterisk(*)

/Users/apple/anaconda3/envs/snakes      这是环境所在位置

/Users/apple/anaconda3/envs/snakes/lib/python3.7     anaconda内置的python3.7所在的位置

刚开始摸索了一段时间不知道要咋搞,后面通过以下步骤成功将 project interpreter 指向了 新建的 snakes 环境下的 Python 3.7

并且试了一下 import numpy 成功!

PYCharm->preferences->Project interpreter->Add...->Conda environment->勾选 existing enviroment ->在interpreter处选择snakes

这样就OK啦!

conda list     #查看已经安装的第三方库

conda install pillow/numpy     #用conda命令安装第三方库

 

9月16日

今天学习的东西和java面向对象机制比较贴近,但是也有很多不同之处

就比如说Python作为一种动态语言,针对某个类的实例,它可以动态地增加属性,这一点还是很神奇的

class Student(object):   # 括号中是父类,所有类最终都会继承object
    def __init__(self, name, score):    # 第一个参数是self,不需要传值
        self.name = name
        self.score = score


student = Student('Elizabeth', 99)
student.age = 21    # 针对student这个实例,多增加一个age属性
print(student.name, student.score, student.age)



这里有几种变量名的表示方法:

__xxx__(以双下划线开头,以双下划线结尾):这表示一个特殊变量,特殊变量是可以直接访问的,不是private变量

_name(一个下划线开头的变量名):这样的实例变量都是可以访问的,但按照约定俗成的规定,_name表示的含义是“虽然可以被访问,但请将它视为私有变量,不要随意访问”

__name(以双下划线开头):这是一个private变量

Python本身没有任意阻止你干坏事的机制,一切全靠自觉

class Student(object):
    # count为类属性,该类的所有实例共享这个属性
    count = 0

    def __init__(self, name):
        self.name = name
        Student.count = Student.count + 1


student1 = Student('Chenxin')
print(Student.count)
student2 = Student('Luyi')
print(Student.count)

关于如何 install Django

我是先进入一个虚拟环境中,用pip指令install Django,就如文档中提示的那样

成功安装之后,就可以 import django,对于Python而言它就是一个模块

Django建议的都是SQLite这类的关系型数据库,但是我觉得MongoDB或者会更加适合这个项目,所以我就尝试用 Django连接MongoDB,这个网站提供了操作步骤

Django MongoDB Engine

Python的第三方插件,Pymongo 

用于python连接mongodb,详细操作见官方文档

 

9月17日

上午花了接近1个半小时学习MongoDB的基本使用,也就是CRUD(create Retrieve Update Delete)

总体来说还是不那么复杂,加上pycharm可以下载mongo plugin,相当于提供了图形化界面

总结一下刚刚的学习内容

Mongodb创建数据库之后,一个数据库里面可以有若干个集合,一个集合里面有若干文件,一个文件里面的数据相当于SQL数据库中一个表中的一条数据。所以collection相当于一张表,表中的每条数据放在collection的每个文件中。

和以往的SQL数据库大不用的是,MongoDB不会去限制存储数据的schema,也就是说一个collection中的每个文件中所存储的数据字段可以不一样,这就提供了很大的灵活性。

如果要实现非常高级的查询条件,就一定要了解Python的正则表达式,这也是我下午将要学习的内容。

这里先把一些基本数据库操作的代码贴在下面

CRUD+sort()方法

import pymongo

# 连接database server
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
# 获取所有的数据库
# dblist = myclient.list_database_names()
# 创建数据库 runoobdb
mydb = myclient["runoobdb"]
# 获取runoobdb数据库下的所有collection
# collist = mydb.list_collection_names()
# 创建collection, MongoDB中的一个文档类似SQL表中的一条记录
mycol = mydb["sites"]
# 创建一个key-value 字典
# mydict = {"name": "RUNOOB", "alexa": "10000", "url:": "http://www.runoob.com"}
# 把mydict中的JSON数据集合插入到创建的名为 sites 的collection中
# x = mycol.insert_one(mydict)
# 将返回的结果输出
# print(x.inserted_id)
# 还可以自己指定id插入,保证unique就可以
# mycol = mydb["site2"]
# mylist = [{"_id": 1, "name": "Elizabeth"},
#           {"_id": 2, "name": "Kris"}]
# #
# 查询数据
# mycol调用find_one()这个函数的时候,返回的是第一条数据,也就是最先插入的
# x = mycol.find_one()
# print(x)
# find()方法可以查询mycol中的所有数据,类似SQL中的select * 操作
# 输出结果为_id和集合内容#
# for x in mycol.find():
#    print(x)
# 以下代码表示:将mycol中的所有除了name字段的数据输出
# 需要注意的是,除了_id这个key可以与其他key设置为0或1之外
# 任意key都只能统一设置为1或者0#
for x in mycol.find({}, {"name": 0}):
    print(x)
# id是默认设置为1的,所以如果需要输出_id,则没有必要设置其为1
for x in mycol.find({}, {"_id": 0, "name": 1}):
    print(x)
# 使用正则表达式进行查询
# 用于读取name字段中第一个字母为"R"的字段
# myquery = {"name": {"$regex": "^R"}}
# 调用limit()函数可以限制返回的符合条件的文档记录条数
# mydoc = mycol.find(myquery).limit(1)
# for x in mydoc:
#    print(x)
print("更新文档记录")
# update_one()方法具有两个参数,第一个为查询的条件,第二个为要修改的字段
# 如果查询到的结果多于一条,则只会修改第一条
# 如果要修改多条数据的字段内容,调用update_many()方法即可#
myquery = {"name": "RUNOOB"}
newvalues = {"$set": {"alexa": "12345"}}
mycol.update_many(myquery, newvalues)
for x in mycol.find():
    print(x)

# sort()方法排序
# 方法的第一个参数为要排序的字段,第二个为排序规则,1为升序,-1为降序,默认为1
# mydoc = mycol.find().sort("alexa", -1)
# for x in mydoc:
# print(x)#

print("删除文档记录")
# 一下操作把集合中的文档全部删除
y = mycol.delete_many({})
print(mydb.list_collection_names(), y.deleted_count, "文档已删除")

还有一点需要注意的是,最开始我使用pycharm的那个mongodb插件的时候,发现新建的数据库并没有显示在列表当中,就觉得非常奇怪。后面找到了刷新按钮,刷新之后就显示出来了

下午我开始尝试用命令行实现计算的功能。本来所有的参数是已经知道的,但又不想用看起来太低级的方法去实现,于是想到用数据库去存储参数值。我先把计算AlGaN所需要的相关参数写入数据库中去了,但在取数的时候发现了很大的困难,更重要的一点是,我意识到这根本没有必要。首先,所有的参数值都是定值,或者说是常数;其次,每次计算的时候都要从数据库中读取。所以,我在想用类将这些数据封装起来或许更加灵活,使用起来也更加方便。我记得在做JpetStore的时候,数据库里面是存储了图片的网址的,它也是不变且需要经常读取使用的,但我认为我要实现的这个东西和JpetStore还是和不一样,我最多是数学的运算,而JpetStore需要实现的是点击了不用的动物会出现其相应的种类介绍和图片,这个数据量和我的不在一个等级。我现在思考的是如何设计父类和子类,如何很好的简化代码,或者说也可以从数据库读取数据,正在尝试中,希望今天可以有结果。

总算把AlGaN的pz值算出来了,其他的就是大同小异了。

但我发现一个问题,就是pz值算出来的速度很慢,不知道是我算法设计不合理还是什么的原因,后期如果非常影响性能的话就要改进一下了

原来除了numpy这个库外,sympy这个库似乎更厉害的样子!可以解决很多数学问题

我是用pip install sympy这个方法安装的,并且在安装之前还要先安装mpmath

不过用pip就很方便啦(不知道为啥git安装失败...有时间再去探究一下

对了,sympy提供的函数详情见 sympy官方文档

今天就先学习到这里,明天上午学习一下python的面向对象的高级编程和实现解方程的功能,下午再安排~Fighting!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值