笔者是C#出身,大学四年主修C#,工作三年也是C#语言开发。但在学校里其他的语言也有相应的课程,eg:Java,Php,C++都学过,当然只是学了皮毛(大学嘛,你懂得),严格来说未必入门,但这些语言的代码阅读倒是不成问题,毕竟触类旁通嘛,有道是“一法通,万法明”,多学学其他的也没坏处。
近期被临时借调到其他项目组,由于新项目用的是Python,本人呢又没有python开发经验(之前只是知道有这门语言),工期呢两周多吧,简单来说就是时间紧,任务重,而且开发环境完全陌生,于是就得快速学会使用一门新语言。如何跨语言学习就成了一个必须要考虑的问题。下文开始讲述一下我的思路仅供借鉴。
第一:环境搭建。这个事情放第一位,如果环境就有问题,以后的开发基本上就是空谈。一般不建议去网上看教程,这时候直接问老员工,或者让他帮忙。(时间紧嘛,如果时间充裕可以自己尝试搭建开发环境)
第二:熟悉ide。首先,尽量使用项目组推荐的ide,避免使用其他ide导致问题出现时,无人解答。当然如果是有高人直接用文本编辑器开发的情况(主要出现在解释型语言或者脚本语言开发),可以忽略这一条。所谓熟悉ide,一方面熟悉界面,哪一部分是什么功能,另一方面熟悉快捷键,提高开发效率。常用快捷键其实没有多少,只选择自己常用的快捷键强化训练。
第三:学习语言。语言学习有速成的,有慢成的。时间允许的情况,建议慢慢来,将基础打扎实。时间不允许的时候,以工作为导向,需要什么就学什么。怎么速成,我也摸索到一点经验。
1.语言的基本类型。因为是跨语言学习,自己脑海中一定有其他语言的干扰,这个不要在意,你需要在意的是基本类型之间的差异,个人建议有对比的学习。将差异记录下来,不要只是大脑强记,勤翻阅笔记,这是个好习惯。
2.语言的基本语法。大多数的编程语言的编程逻辑只有3个,判断、循环和跳转。你需要速记的就是这三种逻辑的所有写法及变体。以下以C#为例:
判断一般是if-else或者是switch-case,条件判断和值判断。
循环一般是for、foreach、while、do-while,已知或者指定长度的循环和便利循环。
跳转一般是break、continue、return、goto(goto是禁忌用法,除非很清晰逻辑运行,否则不建议使用),循环中跳转和值返回。
3.常用操作。常用操作一般是字符串处理,类型转化及格式化数据,各数据类型的常用操作方法,文件、文件夹及路径操作,读写流操作,数据库操作,网络通信和多线程。熟悉相应的操作方法及方法重载。
经过以上几个步骤的学习强化,短期内看懂一门新语言是没有问题的。当然开发不仅是要看懂,更重要的是写出来,这就需要自己动手了,谁也帮不了你,必须自己动手写,大量的写。只有这样才有可能短期速成。其实以上经验也适用于零基础的学习,只是困难会几何倍的上涨,而且也不建议零基础的人选择速成。另外,少看一些教程,直接去找语言相关的api,这是最直接粗暴的办法,因为很多教程是非原创的,也没有人实践过,甚至都不适合你的环境,这些都是有可能减缓你的学习进度。
-------------------------------------------------------分隔符:以下是个人的python基本学习的笔记,仅供参考------------------------------------------------------------------
数据类型:
数据类型有五种标准类型:
Numbers(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典)
数字可以定义复数,a+bj ,a-bj(a,b分别为复数的实部,虚部;J可以大写也可以小写)
list列表,跟C#里的列表不同在于,C#中列表是同一种类型的,python的不是。
eg:
list = [123, ‘1354‘, "78e", 12.5],[32,254,"wewr",22.5];
print list;//全部输出
print list[0][1:3];//返回一个列表,第一个列表的第二个元素后到第四个元素之前的元素,注意是前闭后开的区间 [‘1354‘, "78e"] (3-1)个元素
print list[1][0];//返回一个具体值
print list[1][1:];//返回一个列表,第二个列表从第二个元素开始的所有元素。
字符串可以当做list操作,规则跟list一样
元组用小括号,list用中括号,字典用大括号。元组不支持更新,list支持更新
字典是键值对,一维的。list是多维的。
字典是无序的,列表是有序的
常用方法:
range(start,stop,step=1)返回一个列表, 从start到stop(不包含),累加step ,常用于for循环 eg: range(2,5,2) 结果 [2,4]
字符串操作:
1.strobj.count(搜索字符串,起始位置,结束位置)返回检索字符串在原字符串中出现的次数
2.strobj.endswith(搜索字符串) 返回是否以搜索字符串结尾,不推荐使用其重载方法。
3.strobj.find(搜索字符串) 返回搜索字符串的索引,如果不存在返回-1
4.strobj.index(搜索字符串)返回搜索字符串的索引,如果不存在抛出异常
5.strobj.replace(被替换,替换为)
6.strobj.strip([字符串])默认去掉字符串两端的空格,指定参数后,去掉指定字符串
列表操作:
1.list.count(obj)返回obj在list中出现的次数。
2.list.__len__() 返回list的长度
3.list.extend(seq) 向列表中插入多个元素。用一个列表填充另一个列表
4.list.insert(index,obj) 向列表指定位置插入对象
5.list.pop([index]) 默认返回最后一个元素(类似栈的先进后出),并删除该元素。指定索引时返回指定对象。
6.list.sort([func])按照默认方法排序或者按提供的方法排序。
文件操作:
1.open(“文件名”,“操作方式”)。返回一个文件对象。文件默认是当前路径下,可以指定路径注意路径的书写方式,操作方式常用“r+”,“w+”,“a+”,都是读写操作只是光标初始位置不同。
2.fileobj.close() 关闭当前文件对象。当一个文件对象被重新指定给另一个文件时,会关闭之前的文件,但是建议使用close。
3.fileobj.write() 可以将二进制数据或者文字写入。对应的要使用二进制方式打开文件。此方法不会自动在字符串的结尾处添加换行符。
4.fileobj.read([字节数]) 无参数时将所有内容读出。指定长度时将读出指定长度的内容,并将光标停留在该位置。
5.fileobj.tell()获取文件内光标的位置
6.os.rename(当前名称,新名称) 重命名文件 需要引入os
7.os.remove(文件名) 删除文件 需要引入os
8.fileobj.next() 获取下一行的内容
9.fileobj.readline([字节数]) 读取整行,包括“\r\n” ,如果指定字节数,返回光标位置的指定长度的内容
文件夹操作:
需要引入os模块
1.os.mkdir() 在当前目录下创建文件夹
2.os.chdir(路径)可以跳转到指定路径 注意指定路径的方式 “\”在字符串中需要转义
3.os.getcwd() 显示当前工作路径 os.getcwdu() 显示当前工作路径的unicode对象
4.os.rmdir()删除文件夹。删除文件时必须现将其中内容全部清空。
5.os.chmod(目录,权限) 慎用 修改目录权限
6.os.listdir(path)返回一个列表,显示指定目录下文件夹和文件
7.os.removedirs(path) 递归删除目录
正则表达式:
需要引入re模块
1.re.match(表达式,内容[,匹配模式]) 尝试从字符串的起始位置匹配,匹配成功返回一个匹配对象,若匹配不到返回None;
2.re.search(表达式,内容[,匹配模式]) 扫描整个字符串,返回第一个匹配的结果,如果没有匹配到就返回None
3.re.sub(表达式,替换为字符串,原始字符串[,替换次数,匹配模式])
网络通信Socket:
需要引入socket模块
服务器端
1.socket() 创建套接字对象
2.sobj.bind(主机名,端口号)绑定地址套接字
3.sobj.listen(最大连接数) 开始监听端口,并指定最大监听数量
4.sobj.accept() 阻塞式接受tcp请求
客户端
5.sobj.connect(主机名,端口号) 连接主机
通用方法
6.sobj.recv(缓冲区大小) 接收数据 ,以字符串返回
7.sobj.send(字符串) 发送字符串
8.sobj.close() 关闭套接字
多线程:
需要引入thread模块
thread.start_new_thread(线程函数,参数元组[,可选参数]) 开始新线程
需要引入threading模块
threading.currentThread() 返回当前线程变量
threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程
threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
Thread类 继承Thread类,需要建议重写_init_(),run()方法 ,继承中子类不会主动去调用父类构造函数
run() 线程活动的方法
start() 启动线程
isAlive() 返回线程是否活动
getName()
setName()
join([超时时间]) 等待线程中止(调用中止、正常退出或者抛出异常) 。如果设置超时时间,如果在超时时间之内没有阻塞线程就不再阻塞该线程。实际中,在前一个线程未完成的情况下,下一个线程从前一个线程的结束时间起再设置一段超时时间。
线程同步: threading.lock() 创建一个线程锁对象
tlock.acquire() 加锁
tlock.release()解锁
将只允许一个线程运行的代码放在锁对象的两个方法之间。
Json:
需要引入json模块
json.dumps(对象) 将对象转换成json字符串
json.loads(字符串) 将json字符串转成pytho的数据类型 从输出结果看是一个字典
python的面向对象
python在设计之初就包含了面向对象的思想。
类,方法,继承,对象,实例化这些常见的概念在python中也存在。但是值得注意的是类变量(或者叫属性)与常见的面向对象语言中的属性变量不太一样。
python中的类变量最大的特点就是在整个实例化中是公用的,因此不建议在类中定义变量。类似与C#中的静态公共变量。在类的内部使用时,用类名加点来调用。
构造函数是特定的__init__(),与C#或者Java的构造方法是不同的。
方法的声明实现也不同,def关键字表示声明方法,方法必须有一个额外的参数,第一个参数名称默认是self,代表类的实例。在调用的时候却不需要对该参数传值。self不是关键字,换成 runoob 也是可以正常执行的
创建实例不使用new来实例化对象,直接类名加上括号就可以,类似方法的调用。
可以使用del关键字来回收对象,也可以使用析构函数__del__
继承,python是多继承的,声明时使用小括号将父类包裹。python的继承特点:
1.子类不会自动调用父类的构造函数,需要在子类的构造函数中手动调用。
2.python根据类型来调用方法,如果在子类中不存在,才会去试着调用父类的方法。主要是针对方法重写。
私有字段和私有方法都是以两个下划线开头,只能在内部访问。
-------------------------------------------------------ps------------------------------------------------------------
泛泛之谈,不值一哂,只为抛砖引玉。