-
本帖最后由 Mercy 于 2017-11-27 10:33 编辑前提条件 1. 已经获取相关API文档。 登录以下网站获取API相关文档: http://developer.huaweicloud.com/index.html 通过这些文档,可以学习云平台所支持的API参数。 2. 已获取Python OpenStack SDK的官方文档。 登录以下网站获取Python OpenStack SDK 的官方文档: https://developer.openstack.org/ ... dk/users/index.html 了解如何使用Python OpenStack SDK对用户而言非常重要。 3. 已经申请到云平台账号,并开通所需的服务。 Project/Domain参数获取方法见: http://forum.huaweicloud.com/forum.php?mod=viewthread&tid=1813 endpoint/AZ信息见: http://developer.huaweicloud.com/endpoint.html 4. python-openstacksdk 适用于 Python 2.7.x 和 3.5.x 系列版本。 5. 欲了解Python SDK项目的源代码,请访问如下地址。 https://github.com/huawei/python-openstacksdk SDK获取与安装(使用git) 请从GitHub 上下载源代码进行安装。(以下为Linux示例,Windows可以使用pycharm)cd your-workspace-folder git clone https://github.com/Huawei/python ... python-openstacksdk cd huawei-python-openstacksdk # install master git checkout master pip install -r requirements.txt python setup.py install 脚本示例:(脚本示例放在examples文件夹下,见帖子最下方截图) 脚本示例中包含如下内容: 1、创建虚拟机(带安全组、带反亲和性组),将虚拟机加入到ELB后端,从ELB上移除虚拟机,查询ELB后端,删除虚拟机、 2、启动、停止、查询虚拟机 3、创建空卷,创建快照,从快照创建卷,挂载卷到虚拟机,从虚拟机卸载卷,删除卷,删除快照 4、申请弹性IP并绑定给虚拟机,查询弹性IP,删除弹性IP #encoding:utf-8 # Copyright 2017 HuaWei Tld # Copyright 2017 OpenStack.org # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. #encoding:utf-8 import sys reload(sys) sys.setdefaultencoding(´utf8´) import os import random import time from openstack import connection from openstack import exceptions # those services´s endpoint will be auto detected from V3 auth token # # Nova -> ECS # Cinder -> EVS # Neutron -> VPC # Keystone -> IAM # Glance -> IMS # Heat -> RTS # # so, we do not need to setup the endpoint override for them. # setup endpoint override for cloud services os.environ.setdefault( ´OS_CLOUD_EYE_ENDPOINT_OVERRIDE´, ´https://ces.cn-north-1.myhwclouds.com/V1.0/%(project_id)s´ ) os.environ.setdefault( ´OS_VOLUME_BACKUP_ENDPOINT_OVERRIDE´, ´https://vbs.cn-north-1.myhwclouds.com/v2/%(project_id)s´ ) os.environ.setdefault( ´OS_LOAD_BALANCER_ENDPOINT_OVERRIDE´, ´https://elb.cn-north-1.myhwclouds.com/v1.0/%(project_id)s´ ) # create connection with authenticationes username = "XXXXXXXX" password = "XXXXXXXX" projectId = "XXXXXXXX" userDomainId = "XXXXXXXX" auth_url = "https://iam.cn-north-1.myhwclouds.com/v3" conn = connection.Connection(auth_url=auth_url, user_domain_id=userDomainId, project_id=projectId, username=username, password=password) # parameteres for ECS,VPC RANDOM = random.randint(1000, 9999) # 使用随机数以确保查询结果的唯一性 SERVER_NAME = "test-pythonsdk-" + str(RANDOM) IMAGE_NAME = "test-image-" + str(RANDOM) flavor = "s2.small.1" availability_zone = "cn-north-1a" image_id = "c4b5bef2-5cd4-4d26-824c-456ba4515315" network_id = "eafa3880-32f9-4586-9545-1bf5bf9a1842" server_group_id = "70542220-2e4b-499f-b117-16949f9fa6f6" # Nova anti-affinity server group security_group_id = "90241b5b-cf8c-4940-b118-265204b5cdc9" # Neutron security group keypair = "KeyPair-e344" # parameteres for ELB mds_loadbalancer = "16dbea1701154c0ba48b70a5540bfead" mds_listener80 = "2cf38492f14140eb85b5e76ce8d5af74" mds_listener1860 = "e2d3d83e10024470baabe17c537c7444" # parameteres for Scaling resources template_server_id = "de8c4868-6088-4b47-9fdd-58f41c3b39ac" template_volume_id = "089911f0-7065-4645-b66b-75c8c65f8d91" def create_server(): # 带安全组、反亲和性组、AZ创建虚拟机,不支持min_count参数 server = conn.compute.create_server( name=SERVER_NAME, image_id=image_id, flavor_id=flavor, networks=[{"uuid": network_id}], key_name=keypair, availability_zone=availability_zone, security_groups=[{"name": security_group_id}], scheduler_hints={"group": server_group_id}) server = conn.compute.wait_for_server(server, interval=10, wait=300) return server def delete_server(server): conn.compute.delete_server(server) def start_server(server): conn.compute.start_server(server) conn.compute.wait_for_server(server, interval=5, wait=150) # 参数server应该是Server对象,而不是String id def stop_server(server): conn.compute.stop_server(server) conn.compute.wait_for_server(server, status="SHUTOFF", interval=5, wait=150) def attach_volume(server, volume_id): conn.compute.create_volume_attachment(server, volume_id=volume_id) def detach_volume(server, volume_id): conn.compute.delete_volume_attachment(volume_id, server) def wait_for_volume(volume, status="available", interval=5, wait=150, failures=[´error´]): volume = conn.block_store.get_volume(volume) if volume.status == status: return volume total_sleep = 0 if failures is None: failures = [] while total_sleep wait: volume = conn.block_store.get_volume(volume) if volume.status == status: return volume if volume.status in failures: msg = ("Volume %s transitioned to failure state %s" % (volume.id, volume.status)) raise exceptions.ResourceFailure(msg) time.sleep(interval) total_sleep += interval msg = "Timeout waiting for %s to transition to %s" % (volume.id, status) raise exceptions.ResourceTimeout(msg) def wait_for_snaps**(snaps**, status="available", interval=5, wait=150, failures=[´error´]): snaps** = conn.block_store.get_snaps**(snaps**) if snaps**.status == status: return snaps** total_sleep = 0 if failures is None: failures = [] while total_sleep wait: snaps** = conn.block_store.get_snaps**(snaps**) if snaps**.status == status: return snaps** if snaps**.status in failures: msg = ("Snaps** %s transitioned to failure state %s" % (snaps**.id, snaps**.status)) raise exceptions.ResourceFailure(msg) time.sleep(interval) total_sleep += interval msg = "Timeout waiting for %s to transition to %s" % (snaps**.id, status) raise exceptions.ResourceTimeout(msg) # def create_image(server, name, **metadata): # 该方法限制太多,不建议使用,建议在控制台页面导出镜像 # server = conn.compute.get_server(server) # conn.compute.create_server_image(server, name, **metadata) # # 请确保name的唯一性 # images = conn.image.images(name=name, owner_id=server.project_id) # return images.next() def list_servers(**query): print("****************************List Servers:****************************") for server in conn.compute.servers(**query): print(server.name) def list_loadbalancers(): print(´****************************List Load Balancer:****************************´) query = { # ´vip_address´: ´192.168.2.36´ # ´name´: ´elb-yc5f´ } for load_balancer in conn.load_balancer.load_balancers(**query): print(load_balancer) def add_members_to_listener(listener, members): print(´****************************Add Member To Listener:****************************´) # listener = "83c8765e77a84f7b9dbe4215564171cc" # members = [{"server_id": "5b9762f4-4883-4664-9ca6-6bd9feef75df", "address": "192.168.0.40"}] conn.load_balancer.add_members_to_listener(listener, members) def wait_for_job(job_id, status="SUCCESS", interval=3, wait=60, failures=[´FAIL´]): job = conn.load_balancer.get_job(job_id) if job.status == status: return job total_sleep = 0 if failures is None: failures = [] while total_sleep wait: job = conn.load_balancer.get_job(job_id) if job.status == status: return job if job.status in failures: msg = ("Job %s transitioned to failure state %s" % (job_id, job.status)) raise exceptions.ResourceFailure(msg) time.sleep(interval) total_sleep += interval msg = "Timeout waiting for %s to transition to %s" % (job_id, status) raise exceptions.ResourceTimeout(msg) # 创建、删除虚拟机示例,并将虚拟机加入listener后端 print("****************************Create Server:****************************") test_server = create_server() print(test_server) print("****************************Add Member to Listener:****************************") test_server_ip = test_server.addresses.values()[0][0].get(´addr´) # 获取虚拟机IP test_add_member = [{"server_id": test_server.id, "address": test_server_ip}] # 组装member消息体 add_job = conn.load_balancer.add_members_to_listener(mds_listener80, test_add_member) # 添加ECS后端到ELB上 add_job = wait_for_job(add_job.id) # 等待后端添加成功 print(add_job) listener_members = conn.load_balancer.listener_members(mds_listener80) # 查询ECS后端列表 member_id = "" for member in listener_members: # 获取member_id print(member) if member.server_id == test_server.id: member_id = member.id break print("****************************Remove Member from Listener:****************************") test_remove_member = [member_id] # 组装member消息体 remove_job = conn.load_balancer.remove_members_of_listener(mds_listener80, test_remove_member) # 移除ECS后端 remove_job = wait_for_job(remove_job.id) # 等待后端移除成功 print(remove_job) listener_members = conn.load_balancer.listener_members(mds_listener80) # 查询ECS后端列表 for member in listener_members: print(member) delete_server(test_server.id) # 删除虚拟机 # 启动、停止、查询虚拟机 conn.compute.start_server(template_server_id) # 启动虚拟机 template_server = conn.compute.find_server(template_server_id) # 查询指定server # 等待server状态为ACTIVE,注意wait_for_server中的server参数要是Server对象,而不能只是server_id template_server = conn.compute.wait_for_server(template_server, interval=5, wait=150) print(template_server) conn.compute.stop_server(template_server_id) # 停止虚拟机 template_server = conn.compute.wait_for_server(template_server, status="SHUTOFF", interval=5, wait=150) print(template_server) servers = conn.compute.servers(name="test") # 过滤查询虚拟机示例 for server in servers: print server # 卷、快照操作示例:创建空白卷,创建快照,从快照创建卷,挂卸卷,删除卷 blank_volume = conn.block_store.create_volume(size=150, availability_zone=availability_zone, name="test-blank-volume", volume_type="SAS") # 创建空卷,SATA、SAS、SSD blank_volume = wait_for_volume(blank_volume) # 等待卷状态为available print(blank_volume) attach_volume(template_server_id, blank_volume.id) # 挂载卷到虚拟机上,要求卷和虚拟机在同一AZ blank_volume = wait_for_volume(blank_volume, status="in-use") snaps** = conn.block_store.create_snaps**(name="test-snaps**-from-datavolume", volume_id=template_volume_id, is_forced=True) # 从数据盘创建快照 snaps** = wait_for_snaps**(snaps**) # 等待快照状态为available print(snaps**) 从快照创建卷,要求新卷与快照的AZ相同,volume-type相同 snaps**_volume = conn.block_store.create_volume(snaps**_id=snaps**.id, availability_zone=availability_zone, name="test-volume-from-snaps**", volume_type="SAS") snaps**_volume = wait_for_volume(snaps**_volume) # 等待卷状态为available print(snaps**_volume) attach_volume(template_server_id, snaps**_volume.id) # 挂载卷到虚拟机上 snaps**_volume = wait_for_volume(snaps**_volume, status="in-use") detach_volume(template_server_id, blank_volume.id) # 卸载卷 detach_volume(template_server_id, snaps**_volume.id) # 卸载卷 blank_volume = wait_for_volume(blank_volume) # 等待卷状态为available snaps**_volume = wait_for_volume(snaps**_volume) # 等待卷状态为available conn.block_store.delete_volume(blank_volume) # 删除卷,需要卷状态为available,且卷没有快照 conn.block_store.delete_volume(snaps**_volume) # 删除卷,需要卷状态为available,且卷没有快照 conn.block_store.delete_snaps**(snaps**) # 删除快照 # 弹性IP相关操作: 申请EIP、绑定EIP、解绑定EIP server_inte**ce = conn.compute.server_inte**ces(template_server_id).next() # 获取虚拟机第一张网卡ID print(server_inte**ce) net_external = conn.network.networks(is_router_external=True).next() # 获取公网网络 print(net_external) floating_ip = conn.network.create_ip(floating_network_id=net_external.id, port_id=server_inte**ce.port_id) # 申请EIP,带宽默认是300M/s time.sleep(10) # 等待弹性IP创建并绑定成功 floating_ip = conn.network.get_ip(floating_ip) # 查询EIP状态 print(floating_ip) conn.network.delete_ip(floating_ip) # 删除EIP
-
一、基本介绍 Pypi(Python Package Index)是管理python包第三方软件。所有由python开发出来的包的网址为:https://pypi.python.org/pypi。因为Pypi是python的包管理软件。故此,在使用Pip之前需要先行检验系统是否安装python,再安装pip。 二、检验python是否安装1、windows系统windows系统不会默认安装python。需要自行安装。 2、linxu系统linux系统下,会默认安装python。用户可直接打开linux系统的终端,输入指令 python --version查看所安装的python版本。 三、Python安装python2.x和python3.x两个版本是不兼容的。python3.x引入了python2.x中许多不兼容的特性。至于具体要选择哪个版本的python,用户可以根据自己的项目兼容性来考虑。1、windows系统python下载官网:https://www.python.org/downloads/目前的python-windows版本,官方上已经支持多种格式的文件下载。例如:提供压缩的zip文件、以及windows程序的格式进行下载。其中安装包名中含有64数字的代表该包支持64位的操作系统。这里以 Windows x86-64 executable installer为例说明,代表windows的可执行文件。依据安装向导安装完成即可。选择简单的install now.里面其中会安装出 --> python Launder ,python的IDE,通过它可以直接运行python指令和python程序(缺点:每次运行python只能够通过python launder进行) --> 默认会安装在系统的用户目录下。 --> 默认情况下会安装好pip。用户可以通过打开pythonIDE输入指令:a) import pip b)pip.__version__ 来查看所安装的Pip版本号 查看python安装路径是否已经添加在系统变量path之中,方便直接在windows终端中输入python指令,使用python。同样地,若要系统能够识别Pip,也需要将用户的pip的目录添加至系统变量Path之中,若不添加则需要使用python -m pip来使用pip指令。(我这里的python安装路径为:C:\Users\我是马赛克\AppData\Local\Programs\Python\Python37,pip的安装路径为:C:\Users\我是马赛克\AppData\Local\Programs\Python\Python37\Scripts) --> 打开windows终端,输入echo %Path% -->添加python路径。计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 找到系统变量Path -> 将python的安装路径添加至该变量末尾即可(注意以英文分号为分隔符) 2、Linux系统linux下默认会安装python。
-
本帖最后由 yd_35937100 于 2017-11-15 14:10 编辑pip是python的镜像包管理软件。故此安装pip之前,需要先安装成功python。若python已经安装成功,则直接安装pip即可。否则先行安装python。 windows系统安装python 1、python下载官网:https://www.python.org/downloads/ 2、查看python安装路径是否已经添加在系统变量path之中,方便直接在windows终端中输入python指令,使用python。 --> 打开windows终端,输入echo %Path% -->添加python路径。 计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 找到系统变量Path -> 将python的安装路径添加至该变量末尾即可(注意以英文分号为分隔符) 安装PIP 1、打开windows终端,直接输入指令pip。若系统不识别该指令,则代表没有安装成功。 2、安装pip Python 2 >=2.7.9 or Python 3 >=3.4的版本默认情况下,会安装好pip。下载get-pip.py文件https://bootstrap.pypa.io/get-pip.py 直接运行该python文件即可。 校验安装成功 直接在终端中输入Pip,若打印出pip的使用指南,则代表pip安装成功。 3、已经安装更新pip 直接在windows终端中运行pip install -U pip 4、卸载pip pip uninstall pip Linux系统 安装python linux下默认会安装python,终端直接输入python. 安装pip 1、查看pip是否已经安装 直接在终端中输入pip,查看系统是否已经安装pip。 2、安装pip centOS/REHEL yum install python-pip Debian/Ubuntu apt-getinstall python-pip
-
问题: win 系统下,python3+环境,写一个购物车程序,退出时打印商品价格,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/2017-09-14/Shopping Cart.py", line 6, in print("您选择的商品价格为:"+prices[buy+1]) TypeError: must be str, not int 答案:字符串不能跟整型合并,把需要合并的整型用str转换成字符串即可。 问题: win 系统下,python3+环境,在创建一个嵌套的字典时,执行后报错信息如下 "C:\Program Files\Python\Python36\python.exe" H:/Python培训/2017-09-18/level3.py File "H:/Python培训/2017-09-18/level3.py", line 2 "福建省"{"福州"{"仓山区","晋安区","台江区"}, ^ SyntaxError: invalid syntax 答案:键跟值之间必须要使用:隔开,加上:即可。 问题: win 系统下,python3+环境,在读取一个嵌套的字典时,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/2017-09-18/level3.py", line 14, in for i2 in level(choice1): TypeError: 'dict' object is not callable 答案:字典取键的值时应该使用[]而不是(),()改成[]即可。 问题: win 系统下,python3+环境,在引用一个变量时,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/2017-09-19/shopping car.py", line 22, in print(seller_username) NameError: name 'seller_username' is not defined 答案:引用了一个不存在的变量,引用前需要先定义变量。 问题: win 系统下,python3+环境,在调用一个列表的值时,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/2017-09-19/shopping car.py", line 26, in if user_password == user_password_list(user_list.index(user_name)): TypeError: 'list' object is not callable 答案:取列表的值时应该使用[]而不是(),把()换成[]即可。 问题: win 系统下,python3+环境,在执行一个if..else语句时,执行后报错信息如下 "C:\Program Files\Python\Python36\python.exe" "H:/Python培训/2017-09-19/shopping car.py" File "H:/Python培训/2017-09-19/shopping car.py", line 40 elif choice == "q": ^ IndentationError: expected an indented block 答案:if语句下面的代码块没写就运行,代码块没写时可使用pass语句 问题: win 系统下,python3+环境,choice接收input的输入,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/2017-09-19/shopping car.py", line 40, in if choice >=0 and choice=' not supported between instances of 'str' and 'int' 答案:数据类型错误,input输入的为字符串,字符串无法跟整型比较,使用int将字符串转换成整型即可。 问题: win 系统下,python3+环境,进行文件操作时,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/2017-09-19/shopping car.py", line 56, in ba.write(bala) TypeError: write() argument must be str, not int 答案:write写入必须为字符串,不能为整型,使用str将整型转换为字符串即可。 问题: win 系统下,python3+环境,使用split函数时,执行后报错信息如下 File "H:/Python培训/1.第一模块/作业/模拟登陆/login.py", line 6 x = line1.strip().split(,) ^ SyntaxError: invalid syntax 答案:split中的参数为字符串类型,必须加引号。 问题: win 系统下,python3+环境,写一个程序进行文件操作,读取文件时,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/1.第一模块/作业/三级菜单/level3.py", line 2, in for line in f: io.UnsupportedOperation: not readable 答案:打开文件时使用的是“a”追加模式,无法读取文件,将打开模式改为“r”即可。问题: win 系统下,python3+环境,for循环一个字典时,执行后报错信息如下 File "H:/Python培训/1.第一模块/作业/三级菜单/level3.py", line 18 for y in level[choice] ^ SyntaxError: invalid syntax 答案:for循环语句末尾忘记加:,加上:即可。 问题: win 系统下,python3+环境,写一个程序对文件进行操作,返回文件大小时,执行后报错信息如下 Traceback (most recent call last): File "H:/Python培训/1.第一模块/作业/购物车/shopping.py", line 22, in if os.path.getsize() == 0: TypeError: getsize() missing 1 required positional argument: 'filename' 答案:os.path.getsize()的参数必须为具体的文件,指定具体的文件即可。
-
由于想给自己的Python程序添加日志功能,学习下Python的日志模块。 一个简单的例子: 点击(此处)折叠或打开 [*]import logging [*] [*]##第一个简单的例子 [*]logging.warning('Watch out!') # will print a message to the console 输出到控制台 [*]logging.info('I told you so') # will not print anything 没有任何输出信息 输出至控制台的信息,如下: 点击(此处)折叠或打开 [*]D:\stock>python test4_logger.py [*]WARNING:root:Watch out! 输出日志到文件中 点击(此处)折叠或打开 [*]import logging [*] [*]##输出到example日志文件中 [*]logging.basicConfig(filename='example.log',level=logging.DEBUG) [*]logging.debug('This message should go to the log file') [*]logging.info('So should this') [*]logging.warning('And this, too') 在当前目录中,有一个example.log日志文件,输出日志如下: 点击(此处)折叠或打开 [*]DEBUG:root:This message should go to the log file [*]INFO:root:So should this [*]WARNING:root:And this, too ----------------------------------------简单的日志的分割线----------------------------------------------------------- 由于自己写的模块,需要模块化,要有配置文件,能复用。控制台和文件都能输出。 源代码如下: 配置文件如下: 点击(此处)折叠或打开 [*][loggers] [*]keys=root,simpleExample [*] [*][handlers] [*]keys=consoleHandler,fileHandler [*] [*][formatters] [*]keys=simpleFormatter [*] [*][logger_root] [*]level=DEBUG [*]handlers=consoleHandler,fileHandler [*] [*][logger_simpleExample] [*]level=DEBUG [*]handlers=consoleHandler,fileHandler [*]qualname=simpleExample [*]propagate=0 [*] [*][handler_consoleHandler] [*]class=StreamHandler [*]level=DEBUG [*]formatter=simpleFormatter [*]args=(sys.stdout,) [*] [*][formatter_simpleFormatter] [*]format=%(asctime)s - %(name)s - %(levelname)s - %(message)s [*]datefmt= [*] [*][handler_fileHandler] [*]class=logging.handlers.TimedRotatingFileHandler [*]level=DEBUG [*]formatter=simpleFormatter [*]args=("zsd.log", "midnight") Python执行文件: 点击(此处)折叠或打开 [*]import logging [*]import logging.config [*] [*]logging.config.fileConfig('logging.conf') [*]# create logger [*]logger = logging.getLogger('simpleExample') [*] [*]# 'application' code [*]logger.debug('debug message') [*]logger.info('info message') [*]logger.warn('warn message') [*]logger.error('error message') [*]logger.critical('critical message') [*]
-
本帖最后由 燕姑娘 于 2017-10-12 17:38 编辑作者:xybaby来源:马哥Linux运维 我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段代码直接出错,抛出了异常,我不认为这是陷阱。比如,Python程序员应该都遇到过的“UnboundLocalError”, 示例: 2786 对于“UnboundLocalError”,还有更高级的版本:2787可能对于很多python新手来说,这个Error让人摸不着头脑。但我认为这不算陷阱,因为这段代码一定会报错,而不是默默的以错误的方式运行。不怕真小人,就怕伪君子。我认为缺陷就好比伪君子。那么Python中哪些真正算得上陷阱呢?第一:以mutable对象作为默认参数这个估计是最广为人知的了,Python和其他很多语言一样,提供了默认参数,默认参数确实是个好东西,可以让函数调用者忽略一些细节(比如GUI编程,Tkinter,QT),对于lambda表达式也非常有用。但是如果使用了可变对象作为默认参数,那么事情就不那么愉快了。2788惊喜不惊喜?!究其原因,python中一切都是对象,函数也不列外,默认参数只是函数的一个属性。而默认参数在函数定义的时候已经求值了。2804stackoverflow上有一个更适当的例子来说明默认参数是在定义的时候求值,而不是调用的时候。2790python docoment 给出了标准的解决办法:2791第二: x += y vs x = x + y一般来说,二者是等价的,至少看起来是等价的(这也是陷阱的定义 — 看起来都OK,但不一定正确)。2792呃,被光速打脸了?2793前者x指向一个新的对象,后者x在原来的对象是修改,当然,那种效果是正确的取决于应用场景。至少,得知道,二者有时候并不一样。第三,神奇的小括号–()小括号(parenthese)在各种编程语言中都有广泛的应用,python中,小括号还能表示元组(tuple)这一数据类型, 元组是immutable的序列。2796但如果只有一个元素呢2797神奇不神奇,如果要表示只有一个元素的元组,正确的姿势是:2798第四:生成一个元素是列表的列表这个有点像二维数组,当然生成一个元素是字典的列表也是可以的,更通俗的说,生成一个元素是可变对象的序列很简单嘛:2799看起来很不错,简单明了,but2800我猜,这应该不是你预期的结果吧,究其原因,还是因为python中list是可变对象,上述的写法大家都指向的同一个可变对象,正确的姿势2801
-
本帖最后由 coding 于 2017-10-11 17:09 编辑对于完全没有编程经验的初学者,在学习python的时候,面对的不仅仅是python这门语言,还需要面临“编程”的一些普遍问题,而有特别明显的两个错误认知是:[*]错误认知一:一些初学者认为python很简单,就以为编程很简单。 [*]错误认知二:没有学好基础知识,听说django很火,就开始学django开发web。种种迹象表明,这些从零开始的学习者,普遍不知道从何入手,找了本编程教材发现第二章开始就看不懂了缺少计算机基础知识,被一些教程略过的“常识性”问题卡住遇到问题不知道怎么寻找解决方案。看懂语法之后不知道拿来做什么,学完一阵子就又忘了缺少数据结构、设计模式等编程基础知识,只能写出小的程序片段。学习Python有点入门的时候期望过高,进门开始的时候发现并没有那么美好,而多数人就停留在了知道好不知道如何学,知道好但是学起来很费力的情况,一筹莫展。在这里有几点看似心灵鸡汤,但是非常重要的学习建议是:首先要有信心。虽然可能你看了几个小时也没在屏幕上打出一个三角形,或者压根儿就没能把程序运行起来。但相信我,几乎所有程序员一开始都是这么折腾过来的。建议没有任何编程经验者,象学C语言那样来训练学习python,当然有可能你也不知道c是怎么学的!!!选择合适的教程。有些书很经典,但未必适合你,可能你写了上万行代码之后再看它会比较好,推荐以下基本入门书:[*]《父与子编程》 [*]《Learning Python》 [*]python学习手册第五版(入门) [*]python核心编程第二版(深入学习)写代码,然后写更多的代码。光看教程,编不出程序。从书上的例程开始写,再写小程序片段,然后写完整的项目。互补补强学习基础。除了学习编程语言,也兼顾补一点计算机基础,和英语。敲代码。不但要学写代码,还要学会看代码,更要会调试代码。读懂你自己程序的报错信息。再去找些github上的程序,读懂别人的代码。查文档。学会查官方文档,用好搜索引擎和开发者社区。下面是Python入门学习分四个阶段:一.看视频,选一套完整视频,要快速浏览一遍,不要细纠,目的是对 python 形成整体的认识,估计半个月时间吧,建立认知框架,边看边把从语句、表达式、顺序结构、判断结构、循环结构基本理论搞定,最后过度到函数抽象,类抽象。二.选一本覆盖面比较全的教材,我看的是深入python3和廖雪峰老师的教程,你可以选一本或者其他的,把例子敲一遍,看明白即可,看完肯定会忘…… 但是也不要回头再看, 通通看一遍就好, 目的是巩固掌握基础知识和查找位置,这本教材就是之后的参考书了。三、基于打好的基础后,再玩高级的应用:生成器、装饰器、类的一些属性的高级用法、正则、多线程、多进程等,学习框架文档。四、尽快利用python做点事情。前面三阶段要快,都是为这个阶段做铺垫,这时就可以利用所学解决下身边的事情了,比如看新闻说每年存一万五,四十年可以变亿万富翁,你可以验证下,我们要学以致用。学python是件开心的事,这时可能遇到各种困难,这时回头复习参考书上对应知识点,同时去谷歌百度,如果自己写不出来也可以参考别人的项目去做点事情,过一阵子对python了解后自己就知道该学啥了,是web开发,还是爬虫,或者数据分析,机器学习。我们拿Python自动化开发工程师为例,一个资深的系统运维工程师在北京工资7000到1万左右,如果会python编程,工资可以到达1.5万。好多系统运维工程师对学习python有动力和需求,但学习的方法都很惨,不知道学Python的你怎么样?
-
本帖最后由 yd_27922552 于 2017-10-10 14:43 编辑今年年初,Swift 语言在 TIOBE 指数排行榜中曾一度进入前十名。不过近期,其成绩在不断下降,本月甚至又回到了第 16 位。 多数情况下,开发者会用 Java 编写 Android 应用,用 Swift / Objective-C 编写 iOS 应用。但因为同一个应用要同时维护 2 个不同平台的代码库,因此也有不少开发者开始选择使用移动混合应用开发框架,像是微软的 Xamarin(C#)、Apache 的 Cordova(JavaScript),以及 Ionic(JavaScript)等。这也导致,像 Java 和 Swift 这样的语言会有所下降,而 C#和 JavaScript 等语言越来越受欢迎。 10 月编程语言排行榜 TOP20 榜单:2629 Top 10 编程语言 TIOBE 指数走势(2002-2016) 2630 其他编程语言排名 第 21-40 名如下,可能存在遗漏: 2631 第51-100名如下,由于它们之间的数值差异较小,仅以文本形式列出(按字母排序): [*]4th Dimension/4D, **, ActionScript, APL, AutoLISP, bc, Bourne shell, C shell, CFML, cg, CL (OS/400), Clipper, Common Lisp, Elixir, Elm, Euphoria, Forth, Groovy, Haskell, Icon, Inform, Io, J, Korn shell, Ladder Logic, Maple, MOO, Moto, MQL4, MUMPS, NATURAL, NXT-G, OCaml, OpenCL, OpenEdge ABL, Oz, PL/I, PostScript, PowerShell, Q, REXX, Ring, RPG (OS/400), Smalltalk, SPARK, SPSS, Stata, Tcl, Verilog, VHDL 历史排名(1987-2017) 注: 以下排名位次取决于 12 个月的平均值。 2632 编程语言“名人榜”( 2003-2016) “年度编程语言”获奖名单如下图所示,该奖项授予一年中评分最高的编程语言: 2633 【说明】 TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如 Google、MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。 这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开发新系统时作为一个语言选择依据。 来源:TIOBE 编译:开源中国
-
本帖最后由 码小玩 于 2017-10-9 11:51 编辑 [color=rgb(51,51,51)]我写Python已经有一段时间了,当我回顾起一些较老的代码时,我有时会感到一些畏缩。例如,当我刚开始编程的时候,我用python编写了这个Sudoku 游戏(在GitHub上可以获得)。我当时认为这是我最好的作品之一。事实证明,我甚至不能克隆并运行它,因为我没有添加一个setup.py或 requirements.txt文件,这是我今天绝不会犯的错误![color=rgb(51,51,51)] [color=rgb(51,51,51)]这让我反思了多年来Python代码的质量是如何变化的。它确实变得更干净,更健壮,更易于阅读。但是是什么使它成为这样的呢?[color=rgb(51,51,51)] [color=rgb(51,51,51)]在这篇文章中,我将探讨一下对于编写python代码方式所做的一些改变——不管是大的还是小的。我这样做是希望能够帮助你提高Python代码的质量。其中一些技术甚至可能适用于其他语言和技术。 1.让你的代码成为可PIP安装(PIP-installable)包 [color=rgb(51,51,51)] [color=rgb(51,51,51)]当你拿到一个新的Python包时,开始使用它还是比较容易的,你所做的只需输入“pip install”,加上包名或者路径,然后运行它。[color=rgb(51,51,51)] [color=rgb(51,51,51)]有很多种方法来完成这项工作,我的方法是为我的项目创建一个setup.py文件。[color=rgb(51,51,51)] [color=rgb(51,51,51)]假定在 “flask_example.py”中有一个简单的Flask程序: from flask import Flask[color=rgb(51,51,51)]app = Flask(__name__) [color=rgb(51,51,51)]@app.route(´/´) [color=rgb(51,51,51)]def hello_world(): [color=rgb(51,51,51)] return ´Hello, World!´ [color=rgb(51,51,51)]def main(): [color=rgb(51,51,51)] app.run() [color=rgb(51,51,51)]if __name__ == ‘__main__’: [color=rgb(51,51,51)] main() [color=rgb(51,51,51)] [color=rgb(51,51,51)]我们可以将其转换为可安装的Python包,首先将其移动到一个单独的文件夹中(我们将其称为“flask_example/”。然后,我们可以在根项目文件夹中创建setup.py文件,该文件看起来是这样的: from distutils.core import setup [color=rgb(51,51,51)]setup( [color=rgb(51,51,51)] name=´flask_example´, [color=rgb(51,51,51)] version=´1.0´, [color=rgb(51,51,51)] description=´Hello, World! in flask.´, [color=rgb(51,51,51)] packages=[´flask_example´], [color=rgb(51,51,51)] install_requires=[ [color=rgb(51,51,51)] ´Flask==0.12.2´ [color=rgb(51,51,51)] ], [color=rgb(51,51,51)] entry_points = { [color=rgb(51,51,51)] ´console_scripts´: ´runserver=flask_example.flask_example:main´ [color=rgb(51,51,51)] } [color=rgb(51,51,51)]) [color=rgb(51,51,51)] [color=rgb(51,51,51)]这样做有一些优点。首先,你现在可以使用“pip install -e .”本地安装你的应用。这使得开发人员可以更容易地克隆和安装你的项目。因为setup.py文件将处理所有繁重的工作。[color=rgb(51,51,51)] [color=rgb(51,51,51)]其次,setup.py还可以处理依赖管理工作。install_requires变量允许你定义使用的包和特定的版本。如果你不确定所使用的包和版本,你可以运行“pip freeze”来查看这些信息。[color=rgb(51,51,51)] [color=rgb(51,51,51)]最后,这样还允许你为你的包定义入口,这只需在命令行上输入“runserver”来执行代码。 2.在预提交(Pre-Commit )钩子上整理(Lint)代码 [color=rgb(51,51,51)] [color=rgb(51,51,51)]使用linter可以在代码中解决很多问题。PyLint是Python的一个很好的linter,如果你使用像Git这样的版本控制系统,那么你可以在提交代码前,让Git通过一个linter运行你的代码。[color=rgb(51,51,51)] [color=rgb(51,51,51)]要做到这一点,需要安装PyLint包。 pip install pylint [color=rgb(51,51,51)] [color=rgb(51,51,51)]然后,将以下代码添加到.git/hooks/pre-commit中。如果你已经有了一个预提交钩子,那么简单地将pylint命令附加到文件的末尾。 #!/bin/sh pylint [color=rgb(51,51,51)] [color=rgb(51,51,51)]这可以在提交到Git库前就捕捉所有类型的错误。你可以对代码中的语法错误以及其他的一个良好的linter 可以捕捉到的错误说再见了, 3.使用绝对导入还是相对导入 [color=rgb(51,51,51)][color=rgb(51,51,51)]在python中,导入命令语句中(如 from . import module_name)很少使用相对模块路径。如果你已经经历了为你的项目创建setup.py文件(或者类似的机制)的过程, 你可以简单地通过它们的完整模块路径来引用子模块。[color=rgb(51,51,51)] [color=rgb(51,51,51)]在Python 风格指南PEP-8中推荐使用绝对导入。这是因为在它们的名字里包含了更多的信息,而且根据 Python Softwa的说法,这样也有“更好的表现”。[color=rgb(51,51,51)]我深有体会的是使用相对导入很快会成为一场噩梦。当你开始编程的时候,万事皆好,但是,一旦你可以移动模块或者进行重大重构的时候,这会让你感到头疼了。 4.上下文管理器 [color=rgb(51,51,51)] [color=rgb(51,51,51)]无论你何时打开一个文件、流或者是连接器的时候,你都会和上下文管理器打交道。上下文管理器的重要性在于:如果使用恰当,它们可以处理诸如关闭文件时抛出异常这样的问题。为了做到这一点,只需使用关键字。 [color=rgb(51,51,51)] [color=rgb(51,51,51)]下面是大多数Python初级程序员可能写入文件的语句。 f = open(‘newfile.txt’, ‘w’) f.write(‘Hello, World!’) f.close() [color=rgb(51,51,51)] [color=rgb(51,51,51)]这相当简单,但是想象一下如下场景:你正在将成千上万行代码写入一个文件。在某个时候,出现了一个异常。因为异常的产生,你的文件没有正确地关闭,那些所有的你认为已经正确写入文件的数据都损坏或丢失了。[color=rgb(51,51,51)] [color=rgb(51,51,51)]不过,不要担心,通过一些简单的重构,我们可以确保文件正确地关闭,即使遇到异常。我们可以这样做,如下所示。with open(‘file’, ‘w’) as file: file.write(‘Hello, World!’) [color=rgb(51,51,51)] [color=rgb(51,51,51)]太棒了!真的很简单。此外,代码看起来更清爽,而且更简洁。你还可以使用单个“with”语句打开多个上下文管理器,从而消除了嵌套“with”语句的需要。with open(‘file1’, ‘w’) as f1, open(‘file2’, ‘w’) as f2: f1.write(‘Hello’) f2.write(‘World’) [color=rgb(51,51,51)]5[color=rgb(51,51,51)].使用良好命名(Well-Named)的函数和变量[color=rgb(51,51,51)] [color=rgb(51,51,51)]在Python,尤其是非强类型语言中,很容易不清楚什么样的函数要返回什么值。特别是当你只是某个库中一些函数的使用者时。如果你可以为开发人员节省在文档中查找函数的5分钟时间,这实际上是一个非常有价值的改进。但是我们该怎么做呢?如何做一些简单的如更改变量名字这样事情,来节省开发时间?[color=rgb(51,51,51)] [color=rgb(51,51,51)]在命名函数或变量时,我喜欢考虑三件主要的事情: [*]函数和变量要做什么 [*]任何与函数或变量相关的单元 [*]函数或变量的数据类型 [color=rgb(51,51,51)] [color=rgb(51,51,51)]例如,如果我想创建一个函数来计算矩形的面积,我可能会将其命名为“calc_rect_area”。但是这不会让用户了解更多的信息。它会返回这个值?或者它会存储在什么位置?这个值单位是英尺还是米?[color=rgb(51,51,51)] [color=rgb(51,51,51)]为了提高这个函数的名字,我会把其改为 “get_rect_area_sq_ft”。这就让用户清楚的了解函数的功能和返回值。也让用户明白面积的单位是平方英尺。[color=rgb(51,51,51)]如果你可以通过给函数和变量恰当的命名来给开发人员处处节约时间,不仅提高了开发效率,也使他们更乐意使用你的代码。 结论 [color=rgb(51,51,51)] [color=rgb(51,51,51)]在作为Python程序员的这些年里,我发现这些技巧还是很有帮助的。有些是我自己摸索出来的,有些是别人教我的。我希望这个列表能够帮助您编写更好的Python代码。 [color=rgb(51,51,51)]原文:[color=rgb(51,122,183)]5 Tips for Writing Better Python 作者: [color=rgb(51,122,183)]Michael Washburn Jr. 翻译:夜风轻扬
-
如果让你选择一种语言,你觉得Python和中文,哪个对于未来更重要? 最近,一直以高素质实习生项目闻名的高盛集团发布了一份《2017高盛调查报告》,针对全球2500名在高盛的夏季实习生调查, 当问到你认为“哪个语言在未来会更重要”时,在被调查的全球2500名80、90后优秀年轻人中,72%选了Python。 Python所代表的数据科学分析能力和编程能力正成为年轻人乃至整个世界最看好的热门或者说必备技能。而除了Python,数据科学领域还有大把语言可以选择,如何基于自己的需要选择一门最适合自己的编程语言开始学习呢? 本篇文章将详细对比解析数据科学领域最热门的几大“网红”编程语言:R,Python,SQL,Java, Scala,Matlab,JavaScript,Ruby,并从优缺点、适用领域几个方向让你迅速了解自己最需要哪一款。 数据科学结合了高大上的统计、数量分析理论与实打实的编程能力,是一个让人想想就有点小激动的工作领域。面对众多编程语言,胸怀大志的数据科学家们在术业有专攻之前难免会有乱花渐欲迷人眼之感。 尽管不同选择之间没有高低对错,但是有几点是必须要考虑清楚的。你在数据科学家这条路上能走多远取决于很多因素,具体包括: 深度在高级数据科学的世界中,老调重弹是没有前途的。选定语言后,努力把各种包和模型都吃透。决定你掌握程度的首要因素是你能接触到哪些特定领域的包。顶级数据科学家必须既是全面编程小能手,也是鼓捣数字神队友。数据科学日常工作的很大一部分都围绕着获取、加工原始数据或“数据清理”,而那些牛逼闪闪的各种机器学习包在这里都毫无用武之地。 数量商用数据科学的步伐通常是快到飞起,因此出活儿快的好处简直数不清。这也使得技术部门能够悄悄地争取一席之地,而只有靠谱的做法才能让把工时降到最低。 质量代码效果最大化有时具有举足轻重的意义,尤其是处理大批量关键数据的时候。编译语言在速度上往往远超解释语言;无独有偶,静态类型语言的故障率也远低于动态类型语言。显而易见,质的提升是以量的减少为代价的。从某种意义上讲,我们可以画出这样一对轴线(广度-深度;数量-质量)。下面列出的每种语言都可以在上述范围内找到自己的位置。心里有谱之后,我们一起来看看这些数据科学语言中的“网红”。下面的内容仅是本人及朋友、同事在研究和个人使用中总结出的数家之言,绝不是什么标准答案。排序基本上是按照“网红”程度来的,嘿喂狗~ 1. R语言(1) 简介R语言以老前辈S语言直系后裔的身份,于1995年闪亮登场,此后一路高歌猛进,从成功走向成功。该项目目前采用的语言包括C、Fortran和R,得到了统计计算R联盟(R Foundation for Statistical Computing)的支持。(2) 证书免费哒!(3) 优点· 开源数据包质量过硬、领域明确、范围广泛。几乎所有你能想到的数量、统计应用都能找到相应的R包,比如神经网络、非线性回归、系统进化、进阶绘图等。· 基础安装内置的统计功能和方法非常全面。此外,R语言尤其适合处理矩阵代数。· 核心优势之一就是利用ggplot2等各种R语言库能够实现数据视觉化。(4) 缺点· 质量。R语言比较慢,这是板上钉钉的。· 领域特定。R语言在统计和数据科学领域如鱼得水,但是在通用编程上就有些力不从心了。· 不走寻常路。R语言的一些“小脾气”可能会让擅长其他语言的程序猿阴沟里翻船。举个栗子,采用多赋值运算从1开始索引,非传统数据结构。(5) 小结:本职岗位的尖兵R语言功能强大,在众多统计和数据可视化应用中表现出众;开源更是带来了大批活跃的贡献者。最近一个时期R语言的走红彰显了它在“本职工作”上的优异表现。 2. Python语言(1) 简介1991年,经Guido van Rossum(吉多·范罗苏姆)推出后,Python就成为了通用语言中的大热门,在数据科学社区中得到了广泛应用。目前使用的主流版本是3.6和2.7。(2) 证书免费哒!(3) 优点· 极受欢迎的主流通用编程语言,模型种类多、适用范围广,有众多社区支持。· 许多在线服务都提供Python API。· 上手简单。低门槛使其成为菜鸟程序猿的理想“初恋”。· Pandas、scikit-learn和Tensorflow等包使Python在高级机器学习应用中也有很强的存在感。(4) 缺点· 型别安全:作为一个动态类型语言,Python时时刻刻求关注。类型错误(比如向心心念念期待着Integer的方法传递了一个String)差不多是家常便饭了。· 对于特定的统计、数据分析问题,R包“海纳百川”式的涵盖范围使其在面对Python时有那么一丢丢优势;但是谈到通用语言,Python总能给你更快、更安全的选择。(5) 小结:哪里需要哪里搬的好手Python是数据科学语言的上佳之选,对象绝不仅限于初学者。很多数据科学流程都围绕着ETL(抽取-转换-加载)展开,这与Python的通用性简直是天作之合。诸如谷歌Tensorflow等库更使得Python在机器学习领域大出风头。 3. SQL语言(1) 简介结构化查询语言(SQL)是关系数据库的定义者、管理者和查询者。虽然自1974年面世后历经多次实现,但核心原则从未改变。(2) 证书看情况-有些实现是免费的,有些受版权保护。(3) 优点· 在关系数据库的查询、升级和操作上效率极高。· 声明语法的使用让SQL通常都具有极强的可读性,比如“SELECT name FROM usersWHERE age > 18”的意义就十分明确清晰。· SQL应用范围广泛,因此熟悉该语言还是很有用的。程序猿们利用诸如SQLAlchemy等模块可以直接把SQL整合到其他语言中。(4) 缺点· SQL的分析能力十分有限-除了求和、计数和求平均数,你也没啥能选的。· 具有命令式语言背景的程序猿可能需要一段时间来掌握SQL的声明语法。· SQL具有众多实现,比如PostgreSQL、SQLite和MariaDB等。这些实现的差异之大使得互操作性成为了一个颇为棘手的问题。(5) 小结:高效的经典款与其作为高级分析工具,SQL在数据处理上表现得更加得心应手。然而,数据科学工作的大头都依赖于ETL,SQL的长盛不衰和简明高效恰恰证明这是一门值得现代数据科学家了解掌握的有用语言。 4. Java语言(1) 简介Java是在Java虚拟机上运行的一门非常受欢迎的通用语言。这个抽象计算系统能够实现跨平台的无缝移植。目前有甲骨文公司支持该语言。(2) 证书第八版-免费哒!旧版本受版权保护。(3) 优点· 无处不在。很多现代系统和应用都建立在Java后台上。它能够将数据科学的各种方法直接与现有的代码库整合;功能强大,你值得拥有。· 强型别。需要确保型别安全时,Java单刀直入的风格对于那些至关重要的大数据应用而言简直是无价之宝。· 作为一种高质量、通用型编译语言,Java非常适合编写高效的ETL产品代码和计算强大度的机器学习算法。(4) 缺点· Java冗长的代码并不适合专门分析和更为细致的统计应用。R和Python等动态类型语言的输出显然更胜一筹。· 与R等领域明确的语言相比,Java并没有太多适用于高级统计方法的的库。(5) 小结:数据科学的有力竞争者把Java作为数据科学首选语言能够带来不少益处。将数据科学产品代码与现有代码库直接无缝整合的能力是众多公司梦寐以求的;你会发现,Java在此方面和型别安全上的优异表现是货真价实的加分项。然而,面对其它语言时,你也不得不面对没有各类统计特定包可用的现状。尽管如此,Java仍然值得拥有-尤其是你已经掌握了R和/或Python的情况下。 5. Scala(1) 简介由Martin Odersky开发,并于2004年发布,Scala是一种在JVM上运行的语言。 它是一种多范式语言,融合了面向对象和函数式编程。集群计算框架Apache Spark就是用Scala编写的。(2) 证书免费!(3) 优点· Scala + Spark =高性能集群计算。 Scala是使用大容量数据集的人的理想语言选择。· 多范式:Scala兼容面向对象和函数式编程,这使得Scala的程序员们两种范例都可用。· Scala被编译为Java字节码并在JVM上运行。 这使得其具有了与 Java语言本身的互操作性,使Scala成为非常强大的通用语言,同时也非常适合数据科学。(4) 缺点· 对于初学者来说Scala并不是一个简单的编程语言来起步和运行。 你最好的选择是下载sbt并使用特定的Scala插件设置Eclipse或IntelliJ等IDE。· 其语法和类型系统通常被认为是比较复杂的。这为来自动态语言(如Python)的用户提供了一个陡峭的学习曲线。(5) 结论:完美,适合大数据当使用集群计算来处理大数据时,Scala + Spark是非常棒的解决方案。 如果你有Java和其他静态类语言的经验,你也将会非常欣赏Scala的性能。然而,如果你的应用程序无法用来处理一定量的数据,这恰恰证明了Scala增加的复杂性,你可能会发现使用其他语言(如R或Python)的效率要高得多。 6. Julia(1) 简介5年前发布的Julia在数值计算领域让人印象深刻。由于几家主要机构(多为金融行业)的早日采用,其形象得到了提升。(2) 证书免费!(3) 优点· Julia是一种JIT(“准时”)的编译语言,可以提供良好的性能。 它还提供像Python一样简单、 动态类型和脚本功能的解释性编程语言。· Julia是专为数值分析而设计的。它也能够进行通用编程。· 可读性。 该语言的许多用户将此视为其主要优点。(4) 缺点· 成熟性。 作为一种新的语言,一些Julia的用户在使用程序包时经历了不稳定。但其核心语言本身据悉是足够稳定,可运用的。· 程序包数量有限是语言处于新生阶段和开发社群较小的另一个后果。不像建立很长时间的R和Python,Julia目前在软件包上还没有太多的选择性。(5) 结论:它是未来Julia的主要问题目前并不能过分苛责。作为最近开发的语言,它不像Python和R这些竞品那样成熟和生产就绪。但是,如果你愿意耐心等待,那么在未来几年里,我们有充分的理由去密切关注Julia的进一步发展。 7. MATLAB(1) 简介MATLAB是在学界和业界广泛使用的一种老牌数值计算语言。 它是由MathWorks公司开发和许可的,MathWorks成立于1984年,主营该软件的商业化。(2) 证书专有的 - 定价根据用途而有所不同。(3) 优点· 专为数值计算而设计。MATLAB非常适合具有复杂数学要求的定量应用,如信号处理,傅里叶变换,矩阵代数和图像处理。· 数据可视化。 MATLAB有一些很好的内置绘图功能。· MATLAB通常被作为诸如物理,工程和应用数学等量化类专业的本科课程的一部分。因此,它在这些领域得到了广泛应用。(4) 缺点· 专利许可。 根据用途(学术,个人或企业),你可能需要支付昂贵的许可证费用。 有免费的备选方案如Octave。 这是你需要认真考虑的问题。· MATLAB不是通用编程的明显选择。(5) 结论:最适合数学需求高的应用MATLAB在整个业界和学界的许多定量和数值研究领域的广泛应用使其成为了数据科学的重要选择。其明确的应用场景是当你的应用程序或日常角色需要大量的高级数学功能时,的确,MATLAB是专为此而设计的。 8. 其他编程语言还有一些数据科学家可能会也可能不会感兴趣的其他主流语言。本节提供了一个快速的概述...当然有充足的论证空间! C++C ++并不是数据科学的常见选择,尽管它具有运行速度快的性能和广泛的主流流行度。其简单的原因可能是生产力与性能的问题。正如一个Quora用户所说:“如果你正在编写代码进行一些可能只运行一次的专项分析,你是愿意花30分钟的时间编写一个将在10秒内运行的程序,还是在10分钟内编写一个将运行1分钟的程序?”这个小伙伴抓到了重点。然而,对于重要的生产级别性能而言,C ++将是实现在低级别机器学习算法优化的绝佳选择。结论:不服务于日常工作,但如果性能表现是至关重要的... JavaScript随着近年来Node.js的兴起,JavaScript越来越成为重要的服务器端语言。然而,它在数据科学和机器学习领域的使用已十分有限(不过可查看brain.js和synaptic.js!)。它具有以下缺点:(1) 入局太晚(Node.js只有8岁!),意味着...很少有相关的数据科学库和模块可用。 这意味着没有引起真正的主流兴趣或动力。(2) 性能方面,Node.js很快。 但JavaScript作为一种语言并不是没有它的槽点。Node’s的优势在于异步I / O,其被广泛使用,且存在于可编译为JavaScript的语言中。 因此,可以想象,数据科学的有用框架和实时ETL处理可以结合在一起。关键问题是这是否会提供些新的特别之处。结论:JavaScript距成为重要的数据科学语言还有很长的路要走 PerlPerl被称为“编程语言的瑞士**”,得名于其作为通用脚本语言的多功能性。它与Python有很多共同之处,同样是一种动态类型的脚本语言。但是,在数据科学领域,它还没有像Python一样的人气。这看起来有点难以置信,尤其是如果你知道它在定量领域如生物信息学中的应用。 Perl在数据科学方面有几个关键的缺点。它不是很突出,它的语法是不友好的。数据科学专用程序库的开发并不像生物信息学那样有大的进展。在任何领域,势头都是关键。结论:一个有用的通用脚本语言,但它并不能给你的数据科学简历带来真正的优势 RubyRuby是另一种通用的动态类型的解释语言。然而,它并没有在数据科学得到像Python一样的应用。这似乎是令人惊讶的,但可能是Python在学术界的主导地位和正面反馈效应的结果。 使用Python的人越多,开发的模块和框架就越多,从而越来越多的人会转而使用Python。SciRuby项目的存在是为了将如矩阵代数这样的科学计算功能引入到Ruby中。但是目前来看,Python还是领先的。结论: 对于数据科学来说目前还不是一个明显的选择,但对简历也没什么坏处 总结好了,现在你有了一个数据科学领域编程语言选择的快速指南。然而,选择最合适语言的关键是,你要了解你使用需求的一般性与特殊性,以及你个人偏爱的基于性能与生产力平衡的开发风格。我一般使用R,Python和SQL,因为我目前的角色主要侧重于开发已有数据的流水线和ETL流程。这些语言可以平衡一般性和生产力来完成这项工作,并可以在需要时使用R的高级统计软件包。不过 – 也许你已经有了Java的经验, 或者你可能想使用Scala来处理大数据。 或者,你热衷于参与Julia项目。也许你在大学学过MATLAB,也许你还想给SciRuby一个机会? 或者你有一个完全不同的建议! 如果是这样,请在下面回复 - 我期待着你的声音! 来源:https://medium.freecodecamp.org/which-languages-should-you-learn-for-data-science-e806ba55a81f
-
本帖最后由 HW Developer 于 2017-9-5 15:59 编辑迭代如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。在Python中,迭代是通过for ... in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的,比如Java代码:for (i=0; i如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:>>> for i, value in enumerate([´A´, ´B´, ´C´]):... print(i, value)...0 A1 B2 C任何可迭代对象都可以作用于for循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for循环。列表生成式列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:>>> L = []>>> for x in range(1, 11):... L.append(x * x)...>>> L[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。列表生成式则可以用一行语句代替循环生成上面的list:>>> [x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用。for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:>>> [x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]res_files_list_str = ´,´.join([os.path.basename(x) for x in res_file_list])[ex if ex.startswith(´.´) else ´.´ + ex for ex in filetypes.split(´,´)]实例 [*]将全路径的文件列表转换成只有basename的文件列表 >>> res_file_list=["c:\\a.png","d:\\b.png","e:\\c.png"]>>> res_files_list_str = ´,´.join([os.path.basename(x) for x in res_file_list])>>> res_files_list_str´a.png,b.png,c.png´ [*]将文件后缀字符串如:"png,.jpg"分割成标准的后缀列表。 >>> filetypes=´png,.jpg´>>> [ex if ex.startswith(´.´) else ´.´ + ex for ex in filetypes.split(´,´)][´.png´, ´.jpg´] 本帖转自华为开发者论坛
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签