2020-06
9

我得有本手册

By xrspook @ 10:52:11 归类于: 烂日记

到底我想要的是什么类型的教材呢?其实我没想明白。大概是个问题我永远都想不明白。从我自学python以来,我觉得自己实在遇到了太多的问题。Think Python 2是一本很好的书,但问题是那个东西实在太跳跃了。他们只会告诉你,你该往哪个方向研究,但是没有确切的告诉你具体的方法。这是一个挺郁闷的局面,从大处上说,这样的教育方式的确有利于学生自学。大概他们默认的学生首先还得备有一大堆的其他教材。起码手边得有一本像字典般的手册。手册这种东西我感觉跟字典差不多,你不可能读懂里面的每一条细则,但是当你要用到某个功能的时候,你得明白如何查找以及如何使用。这里的使用,很多情况下不是单打独斗,而是把多个功能结合在一起。所以,如果我手边只有一本Think Python 2,我怎么可能学的下去呢?!这种觉悟是我学第14章,讲有关文件的时候才领悟到的。这章书里的知识点实在太多,而书里面的例子就好像蜻蜓点水一般,你甚至不知道该如何模仿,你不知道放在某个大的案例里该怎么使用。看完一整章书以后,我感到很蒙圈。他们给我的感觉就像是以高铁的速度,带我游览了故宫。导游讲的是不咸不淡的英语里面夹杂着咖喱味。语速还算可以,但问题是我眼前的画面太多了,我还没搞清楚怎么回事就已经到了下一个讲解点。在一章书里,他们谈到了普通的文件读写,讲到了数据库,讲到了在python里用命令行实现功能。我不知道他们默认的读者到底是什么层次的,为什么我从他们的介绍看来,他们觉得读取文件跟调用数据库又或者是随手用命令行控制所有很简单,根本不需要浪费口水。我只能在那里发呆,不知道发生了什么。直到第14章,他们才表达出了python的根本属性,像乐高积木一样,拼凑就能实现功能。所有的python文件都可以以模块的方式被引用,然后直接调用里面的函数,所以只要你手边的积木足够多,那些积木又足够强大,你可以拼凑出自己的王国。在其它程序语言里,我也试过把其他文件里面的函数搬过来用,但那个时候我只是把整个函数复制过来,而不是用以引入模块的方式。之所以没做到这一步,大概是因为我还没学得那么的深入。

当文件可以以模块方式被引入,然后使用的时候,自然就会进入了其它语言里我没有接触到,但却把我整得很惨的递归。获取一个文件夹里面所有文件的路径是一个递归,这对他们来说是非常简单,再正常不过的递归,但是对我来说,这已经是一个有点让我望而生畏的东西了。对我来说,python的递归就是我心里的魔鬼,我确信某一天,我肯定能克服这个东西。但现在我还没有达到那个层次。

要怎么啃下Think Python 2的第14章,我不知道。即便我把那些文字阅读一遍又一遍,把那些习题全部都亲手过一遍,我觉得我还是知道得不够多。

如果在看Think Python时候,手边必须得有一本手册类的东西,我应该选择什么书呢?

2020-06
5

随机单词扎堆成文

By xrspook @ 14:47:54 归类于: 扮IT

从某本书里随机找单词拼出句子段落。重点是把握好前缀和后缀,前缀要捆绑查找,后缀要关联对应。

Exercise 8: Markov analysis: Write a program to read a text from a file and perform Markov analysis. The result should be a dictionary that maps from prefixes to a collection of possible suffixes. The collection might be a list, tuple, or dictionary; it is up to you to make an appropriate choice. You can test your program with prefix length two, but you should write the program in a way that makes it easy to try other lengths. Add a function to the previous program to generate random text based on the Markov analysis. Here is an example from Emma with prefix length 2: He was very clever, be it sweetness or be angry, ashamed or only amused, at such a stroke. She had never thought of Hannah till you were never meant for me?” “I cannot make speeches, Emma:” he soon cut it all himself. For this example, I left the punctuation attached to the words. The result is almost syntactically correct, but not quite. Semantically, it almost makes sense, but not quite. What happens if you increase the prefix length? Does the random text make more sense? Once your program is working, you might want to try a mash-up: if you combine text from two or more books, the random text you generate will blend the vocabulary and phrases from the sources in interesting ways. Credit: This case study is based on an example from Kernighan and Pike, The Practice of Programming, Addison-Wesley, 1999. You should attempt this exercise before you go on; then you can download my solution from http://thinkpython2.com/code/markov.py. You will also need http://thinkpython2.com/code/emma.txt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import string
import random
from collections import defaultdict
def set_book(fin1,num):
    d = defaultdict(list) # 默认键值为列表
    l = []
    header = ()
    for line in fin1:
        line = line.replace('-', ' ')
        for word in line.rstrip().split(): # 空格换行为分割,单词存入列表
            l.append(word)
    for i in range(len(l)-num): # 以列表序号逐一推进方式建立字典
        header = (l[i-1],) # 元组header为前缀,做键
        for j in range(i,i+num-1):
            header += (l[j],)
            j += 1
        if l[i+num-1] not in d[header]:
            d[header].append(l[i+num-1]) # 列表后缀做键值
    return d
def next(start, book):
    return random.choice(book[start])
fin1 = open('emma.txt', encoding='utf-8')
prefix_num = 3 # 前缀个数
suffix_num = 100 # 后缀个数
book = set_book(fin1,prefix_num)
start = random.choice(list(book.keys())) # 随机前缀开头
final =  start
for i in range(suffix_num): # 截取最后几个单词为前缀找后缀
    final += (next(final[len(final)-prefix_num:], book),) 
for word in final:
    print(word, end=' ')
# reigns alone. A very proper compliment! and then follows the application, 
# which I think, my dear, you said you had a great deal happier if she had no 
# intellectual superiority to make atonement to herself, or frighten those 
# who might hate her into outward respect. She had never seen her look so well, 
# so lovely, so engaging. There was consciousness, animation, and warmth; 
# there was every appearance of its being all in proof of how much he was 
# in love with, how to be able to return! I shall try what I can do. 
# Harriet's features are very delicate, which makes a likeness
2020-06
3

默认理解为数组公式

By xrspook @ 10:22:24 归类于: 烂日记

昨天我才发现,我把Excel文件升级完以后,我的搭档没有用过。因为连续好长一段时间,单位的作业时间都超长,每天都在正常办公室下班时间之前,还没结束。通常会折腾到晚上11点多,运气好的话,可能晚上七八点就结束了,反正总的来说,在我升级完我自己的文件以后,一直都只是我一个人使用。我在三台电脑上用过那个文件。我用的是同一个软件打开,用的是Microsoft 365。其中两台电脑是台式机,搭配的是64位的Win7系统,而另外一个是笔记本电脑,搭配的是64位Win10。二者是有区别的,因为某些功能只有在Win10系统才有更新,但到底具体是些什么,至今我还没搞清楚。自从用了Microsoft 365以后,我也说不准那个软件会什么时候给我更新,比如说晚上回到宿舍,单位的作业很晚才结束,我赶着要把数据搞完然后睡觉,但偏偏在那个时候,打开电脑,打开Microsoft 365,却告诉我他正在升级。这种状况很让人抓狂,因为晚上10-11点的时候,单位宿舍的网速可能非常慢。如果Office在那个时候进行升级,而那个安装包又非常大,这将是毁灭性的。所以下次大概我要给软件设置提醒我升级,但不能为我自动升级,应该由我去选择升级时间,这比开电脑就被吓一跳好多了。理论上说Win7系统上的Microsoft 365对应的是2016的功能,Win上的365对应的是2019的功能,但无论是Win7还是Win10,我的365还是会比传统的Office 2016高级那么一点点,至于高级在哪里,我不知道。

Microsoft是个神奇的存在。office软件不知道从什么版本开始都有32跟64位的版本,365貌似给我的安装包都是32位的版本,但是365在不同的Windows系统下面又有其他分支。

大体上我觉得,Win7下的Microsoft 365,应该跟Office 2016差不多吧。但昨天的实际遭遇告诉我,不是那回事。昨天我才发现,在我三台电脑上都开得好好的公式,在我的搭档的电脑上几乎所有地方都显示错误。这不可能吧!一开始,我怀疑是SUMIFS不能在2016上使用,但搜索过后发现那个函数已经在Office 2016上通行了,那到底是什么呢?结果发现原来是我搭档Excel的选项设置里面勾选了引用空单元格时显示错误,为什么居然有这种脑残设定呢?我用了这么多年的office,从来没遇到过这种事,昨天之前我甚至不知道原来还有个这样的设置。把那个勾去掉以后,还有不少公式的地方显示错误,点击那些公式后发现,在我的电脑上没有表示数组公式的地方,在她的电脑上居然默认成了数组公式,那些东西根本不是数组变成了数组,当然会出状况。所以解决办法也很简单,重新把那个公式确定变回普通公式,所有数据都回来了。为什么在不同的电脑上普通公式会自动变成数组公式呢?这个问题之前我也曾经遇到过,但没有让我的公式全部失效,所以我也就没有理会了,但我发现在某些函数前会多了个@的标志,至于那个东西是干什么的,我不知道。

带着这个问题,我立马去搜索。先是去百度,接着是去必应,最后我还是在Google找到了答案12。原来在Microsoft 365里,默认把所有公式都认为是数组公式,虽然没有很明确地标注出来。不是所有函数都会被误解,但一些包含相对变量的函数就会出现这种毛病,比如说公式里大量使用的indirect。这些公式在数组与非数组里理解是不一样的。当我的搭档在她电脑上把数组公式转为普通公式以后,在我的电脑上,发现数组公式前面多了个@,而这个东西。就是为了让老office兼容,在365里面有没有@,效果完全一致,但在老office里面,多了个@,就说明这个不是数组公式。

我不知道为什么office的进化经常会在一些相对引用与绝对引用里纠缠不清,之前有数据透视表的数据源变成绝对引用,搞死所有人。现在又有偷偷地把公式默认为数组公式。让老版本的软件看到一大片数据错误。他们在这个默默改变的的时候,其实完全可以推荐用户另存为别的Excel格式,通过转换格式把公式修正为老版本可以理解。

这个默认数组公式的问题我没见过中文解释,是不是因为谁用Microsoft 365中文版的人还不够多呢?

2020-05
27

数据汇总小感

By xrspook @ 9:05:03 归类于: 烂日记

理清思路,比埋头苦干重要很多。如果一开始就掌握了方法,就不需要在路上兜那么多的弯。处理数据有这么一句行话,汇总时掉的汗,是录入时脑子进的水。如果一开始就把数据结构设定好,往后的汇总那是行云流水般自然而然的事。我是那种习惯于白手起家的人,通常我不会借用什么特殊的工具,比如说某个系统,我只用最普通常用的办公软件解决问题。

当然了,办公软件我是挑的,比如我只喜欢微软,我不喜欢WPS。而之所以不喜欢WPS,是因为我觉得很多东西他们仍旧留抄袭的层面,在一些非常核心的数据控制方面,他们远没有Office这么强大。有一些经常用到的小技巧,他们的确做了很好的封装要优化。但是会看的看门道,不会看的看热闹,就如一开始所说的,如果数据结构做好了,那些小窍门是不需要用到的。那些小窍门通过Office的高级公式是可以完成的。有人觉得那些小窍门非常有用,但是我觉得如果全盘数据由我控制,我的脑子不会那般进水,自然就不会挖坑让自己踩,那些所谓窍门也就不需要用上了。

跟数据透视表交了朋友以后,我明白到明细数据和汇总数据是彻底不一样的两种东西。你把他们混合起来用,结果将非常恐怖。通常,大家都喜欢这么干,而且觉得这么干是理所当然的事,而之所以有这样的看法,是因为当没有办公软件,没有Excel没有电脑之前,他们在纸质上就是这么干的。在纸质上这么干,可以让他们对整体数据有一个全面的认识了解。但实质上,他们所做的那些事正是数据透视表最擅长的。在纸上完成,只能做某一个分类的,如果要换个统计口径,那一大片数据等于白费。很多人在用Excel的时候,实际上只是把他们在纸上做的那些搬到电脑上。Excel不是一个画图软件,不是艺术家的画板,也不是一个用键盘操控的笔记本。这个强大的软件是有很强汇总计算功能的,我们必须用好这个,用不好别人的优点就是在增加自己的麻烦。软件的天马行空建立在我们说了一些他们能理解听懂的话。软件也是有脾气的,你得按他们的语法去表达你的东西,他才能用他的高超技术化腐朽为神奇。所以,我们首先要知道自己有什么,自己想得到什么,还有软件习惯用什么格式去处理问题。把我们的需求用机器语言翻译出来,然后我们就能得到我们想要的结果。把明细数据和汇总搞在一起其实并不是我们最初获取的数据心态,我们做的其实已经发展过了,要软件替我们做汇总分类,我们就要退回最原始的状态。为什么明细数据和汇总数据必须在一个页面反映出来呢?看数据的时候,我们到底是看每一条数据有没有问题,还是我们只是把那个明细数据当做是一个凑数的工具,而我们的眼睛直接瞄到了最后呢?如果我们关注的只是最后的汇总数据,明细数据摆在那里,难道就只是用来让我们多滑几下鼠标到最后吗?对基层人员来说,他们必须保证每一条原始数据的真实性、准确性和完整性,而对领导来说,明细是什么不重要,他们需要的是各种维度的汇总结果,每个领导的口味不一样,他们想要的汇总口径五花八门。成千上万的明细数据再用一开始纸质那种画大图的方法来汇总,根本赶不上这个时代的节奏。不仅仅是累处理数据的这个人,看结果的人也很烦。

程序语言也是一种语言,射手座有语言天赋,我觉得这可能是真的。

2020-05
9

终于用上了切片器

By xrspook @ 10:20:06 归类于: 烂日记

昨天研究了一个晚上的Excel。其实也没折腾出什么高端的东西出来,都是一些大路的功能。用我以前的方式,也能实现,不过昨天晚上我把它更进一步,让使用者更直观简单。之所以要改进自己,很重要的一个因素是我发现单位的仓号命名会导致筛选一些比较小的仓号的时候如果用输入的方式会误杀。比如说我选1仓的时候,当我输入1,那些什么11,13,16全部都会中招。要避免出现这种低级错误,最简单的方法我觉得是全部用两位数字,甚至直接用上三位。001,002这种东西不会在999之内重叠。但其实,以我们单位的占地,应该达不到三位数字。一个10万吨的立筒仓群里面有18个立筒仓,10个星仓。如果有5个以上的立筒仓群,两位数的命名就会出状况,但显然我们单位没有那么多的地方建这么多组立筒仓。至于浅圆仓,至少是1万吨一个,现在新建的那些甚至达到了2万吨。再怎么牛逼位,我们单位也规划不下100个浅圆仓。因为这就意味着起码有150万吨以上的仓容。加上立筒仓,要达到200万吨几乎不可能。以我们单位的占地,以及所建厂房的仓容,即便到达200万吨也用不上三位数字的编码。

以普通人的思路去考虑,从1-99编码是再正常不过的事,但是从一个不重叠数字的角度考虑,如果用的是CTRL+F的搜索,尚且可以选择单元格匹配,但是如果那是一个列表里面的筛选项,效果就会很尴尬。当然,也有一个不会中招的方式,就是用手动单选。如果你手头上有100个仓,你要单选其中一个。无论如何,这都比不上你直接输入数字快。点到某个单元格的下拉菜单里面去挑选某个东西是一个非常没有效率的做法。昨晚我突然领会到在这种时候,我需要使用切片器。其实切片器跟传统的筛选没什么区别,但是切片器可以直接放在工作表外面,你可以把它拉得很长。在普通的下拉菜单里面,某个视图你可能只有5-10个选项,但是只要你的电脑屏幕足够大,你的切片器就可以很大,极限情况下,一列估计能排下20个。5个选项和20个选项的区别在于下拉的滚动条被大大缩小了。Office 2003没有切片器,我不知道2010有没有,因为我几乎没有用过2010,但我知道2013年以后的Office具备这种功能,除了切片器以外,还有日程表。日程表这个东西我试用了一下,感觉能实现我的某些功能,但是为什么那个东西只能用滑动条而不能手动输入数据控制呢?如果要做到自由的控制,难道我要为那个日程表写个宏?

洗澡的时候我一直在考虑。计算堆存费这个东西最根本的是判断起始时间。决定了开始与结束,中间的那些东西就只是重复得做同样的事情而已。可悲的是,我脑子里只有python,没有Excel VBA。几乎不假思索地,我就已经设定好了有了开始结束以后,中间的循环在python应该怎么写。虽然我完全不知道要怎么让python读取我的Excel文件。python能实现的功能,Excel VBA应该也能实现,顶多是语句比较麻烦而已。做好了前期准备以后,计算那些东西就只是一个秒杀的过程。

当别人在想用什么程序可以解放自己,策划这要为之付多少钱的时候,我想的却是怎么自己写一个程序,解放生产力。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress