最近有一位朋友准备实习开始找工作,来跟我交流他目前找工作遇到的一些情况:
“我被找工作弄得满头包,觉得好像自己学的专业很没有市场,也没有很好的大公司背书,根本没有和 HR 谈薪资的底气。”
他最近撒简历发现很多公司的招聘信息,都惊人的相似。
很多很多岗位在招聘的JD里都写上了:“有Python编程经验”优先这样的条件。这个要求就让没学过Python编程的学生都不敢投简历了。
我去网上仔细查了查,才发现:
原来,前几年国家政策就开始大力扶持,python编程进入小学课堂,各大高校也相继开设人工智能专业;
腾讯、阿里、百度、网易、谷歌、滴滴等大型互联网企业更是大量使用python开发。这一系列政策和市场迹象都表明,Python编程确是当下发展的新趋势。
“也许你还未发现,但已在趋势之中。”Python编程正逐渐成为未来5~10年新一代毕业生、职场人的新一代“Office技能”。
而它在信息搜集、数据分析等方面的应用,也正在各行各业展开......
写论文通过Python编程可以定向爬取某个领域的论文、文献,并进行整理分析,帮助自己进行学习、研究。运营岗位通过Python编程爬取用户网上的浏览信息、点击行为等,同时对数据进行清洗、分析和可视化,从而精确指导运营动作,制定高效的运营策略。金融行业
用Python编程几行代码就足以完成,金融分析中的典型复杂任务:数据收集、数学计算,以及结果可视化,从而快速反应、实时提供宝贵意见,比竞争对手先行一步。
设计岗位用Python编程快速全网搜索和抓取各种风格的美图、最新的设计素材和最有创意的案例,让甲方爸爸一次就满意。
......
这一下让我想到,我一个朋友的实习经历。
他是学土木工程的,但不是很喜欢这个专业。所以找的实习岗位和工作也不对口。但是他自己很喜欢产品设计这个工作。
一个偶然的机会,他通过自学掌握了一些基础的编程知识,在跳槽某个大公司的产品经理岗的时候,总监看到他简历里写了“熟悉Python编程”,就问了他几个问题。
结果,没想到他因为简历里这句话,顺利拿到了这家公司产品实习经理的offer,最后成了同批实习生里面唯一一个留在不擅长岗位却转正的人,现在已经月薪2万了。
不仅是刚毕业的大学生生需要具备这样的编程技能,职场人士有需要一些像Python编程这样的技能。
Python获取全网资料
写方案不怕来回修改
我室友前段时间,新接了一个活动策划的大项目,想方案头发掉的一把接一把,每天洗澡下水道都要被堵住了。
为了找一些新颖的活动海报,不同的图片素材,她经常需要五六个浏览器点开好几十个网站,一张图一张图手动挑选大致相同的图片,真的是又浪费时间又毁眼睛。
“半夜一点,我在电脑前,眼睛跟着鼠标飞速移动。真的不知道我这个项目能赚几个亿… 真的不知道要逼死谁……”他和我疯狂吐槽。
好不容易想出了一些好的方案设计,设计出了好看的海报。还是被甲方爸爸用各种各样的理由退回来修改:
视觉上的冲击不够,不了解现在大家都喜欢什么样的呈现;
活动方案太老套,玩法不够新缺乏互动性;
太想当然了,不考虑时间周期和成本。
后来,室友找我帮她客观分析一下,我才发现原来问题的根本原因,就是她掌握的素材太少,对当下的流行玩法和成本计算,掌握得不够全面、精准。
第二天上班,我帮他,用大概10分钟帮她找到了当下活动的最In玩法,搜集到更多图片素材和设计灵感,还帮她做了一个成本计算工具,在活动策划的同时直接算出成本。
当周参与投标结束,她一回到家就兴奋地告诉我,这次甲方爸爸”炒鸡”满意,终于定下来用她的方案了。
她说一定要学会Python编程。“能用几十行代码就解决的事情,真的不想再自己花时间、费精力,做很多重复性工作了。这感觉就像打游戏开了外挂一样,又爽又轻松!”
这也是我为什么一定要把一门兼顾了“易学”、“实用”的Python编程小课推荐给大家的原因。因为它改变了我对编程的认知,改变了我原始的工作方法和效率。
希望这一次,你也可以抢先抓住机会,在职场上实现加速超车!
感兴趣的小伙伴可以跟我来学技术 10年技术积累
我这里也有很多这方面的干货资料
需要的小伙伴可以参考下图找我来拿
type exec_opts =
{ bound: int
; skip_throw: bool
; function_summaries: bool
; entry_points: string list
; globals: Domain_used_globals.r }
module Make (Dom : Domain_intf.Dom) = struct
module Stack : sig
type t
type as_inlined_location = t [@@deriving compare, sexp_of]
val empty : t
val push_call :
Llair.func Llair.call -> bound:int -> Dom.from_call -> t -> t option
val pop_return : t -> (Dom.from_call * Llair.jump * t) option
val pop_throw :
t
-> init:'a
-> unwind:
( Llair.Reg.t list
-> Llair.Reg.Set.t
-> Dom.from_call
-> 'a
-> 'a)
-> (Dom.from_call * Llair.jump * t * 'a) option
end = struct
type t =
| Return of
{ recursive: bool (** return from a possibly-recursive call *)
; dst: Llair.Jump.t
; formals: Llair.Reg.t list
; locals: Llair.Reg.Set.t
; from_call: Dom.from_call
; stk: t }
| Throw of Llair.Jump.t * t
| Empty
[@@deriving sexp_of]
type as_inlined_location = t [@@deriving sexp_of]
(* Treat a stack as a code location in a hypothetical expansion of the
program where all non-recursive functions have been completely
inlined. In particular, this means to compare stacks as if all Return
frames for recursive calls had been removed. Additionally, the
from_call info in Return frames is ignored. *)
let rec compare_as_inlined_location x y =
if x == y then 0
else
match (x, y) with
| Return {recursive= true; stk= x}, y
|x, Return {recursive= true; stk= y} ->
compare_as_inlined_location x y
| Return {dst= j; stk= x}, Return {dst= k; stk= y} -> (
match Llair.Jump.compare j k with
| 0 -> compare_as_inlined_location x y
| n -> n )
| Return _, _ -> -1
| _, Return _ -> 1
| Throw (j, x), Throw (k, y) -> (
match Llair.Jump.compare j k with
| 0 -> compare_as_inlined_location x y
| n -> n )
| Throw _, _ -> -1
| _, Throw _ -> 1
| Empty, Empty -> 0var GameLayer = cc.Layer.extend({
touchStartX:0,
touchStartY:0,
bullets:[],
enemies:[],
tools:[],
ctor: function () {
this._super();
this.touchStartX = 0;
this.touchStartY = 0;
this.bullets = [];
this.enemies = [];
this.tools = [];
// 播放背景音乐
cc.audioEngine.playMusic("res/sound/game_music.mp3",true);
// 加载plist
cc.spriteFrameCache.addSpriteFrames(res.shoot_background_plist);
cc.spriteFrameCache.addSpriteFrames(res.shoot_plist);
// 添加背景图
var bg = new Background(false);
bg.setPosition(0,0);
this.addChild(bg);
// 添加飞机
var player = new Player(this);
player.setPosition(cc.winSize.width / 2, -player.height / 2);
this.addChild(player);
player.setTag(1);
// 产生敌机
this.schedule(function(){
this.createEnemy(1);
},Global.createEnemySpeed(1));
this.schedule(function(){
this.createEnemy(2);
},Global.createEnemySpeed(2));
this.schedule(function(){
this.createEnemy(3);
},Global.createEnemySpeed(3));
// 产生道具
this.schedule(function(){
this.createTool(1);
},Global.createToolSpeed(1));
this.schedule(function(){
this.createTool(2);
},Global.createToolSpeed(2));
// 添加爆炸道具
var bombNor = new cc.Sprite(cc.spriteFrameCache.getSpriteFrame("bomb.png"));
var bombSelected = new cc.Sprite(cc.spriteFrameCache.getSpriteFrame("bomb.png"));
bombSelected.setPosition(-bombSelected.width/4,-bombSelected.height/4);
bombSelected.setScale(1.5);
var bombBtn = new cc.MenuItemSprite(
bombNor,
bombSelected,
function () {
var bombNum = this.getChildByTag(3);
if(parseInt(bombNum.getString().slice(1))==0){
return;
}
// 全屏爆炸
var blowEnemy = [];
for(var i in this.enemies){
var enemy = this.enemies[i];
blowEnemy.push(enemy);
}
for(var j in blowEnemy){
blowEnemy[j].blowUp();
}
// 数量减一
bombNum.setString("X"+(parseInt(bombNum.getString().slice(1))-1));
}, this);
bombBtn.setPosition(50+bombBtn.width/2,50+bombBtn.height/2);
var bombMenu = new cc.Menu(bombBtn);
bombMenu.setPosition(0,0);
bombMenu.setAnchorPoint(0,0);
this.addChild(bombMenu);
// 爆炸道具数量
var bombNum = new cc.LabelBMFont("X2",res.font);
bombNum.setAnchorPoint(0,0.5);
bombNum.setPosition(bombBtn.getPositionX()+bombBtn.width/2+50,bombBtn.getPositionY());
bombNum.setTag(3);
this.addChild(bombNum);
// 暂停开始按钮
var pauseBtn = new cc.MenuItemSprite(
new cc.Sprite(cc.spriteFrameCache.getSpriteFrame("game_pause_nor.png")),
new cc.Sprite(cc.spriteFrameCache.getSpriteFrame("game_pause_pressed.png")),
function () {
// 暂停音乐音效
cc.audioEngine.pauseAllEffects();
cc.audioEngine.pauseMusic();
pauseBtn.setEnabled(false);
cc.director.pause();
this.addChild(new PauseLayer(pauseBtn),10);
}, this);
var pauseMenu = new cc.Menu(pauseBtn);
pauseMenu.setPosition(20+pauseBtn.width/2,cc.winSize.height-pauseBtn.height/2-20);
pauseMenu.setAnchorPoint(0,0);
this.addChild(pauseMenu);
// 分数
var score = new cc.LabelBMFont("0",res.font);
score.setAnchorPoint(0,0.5);
score.setPosition(pauseMenu.getPositionX()+pauseBtn.width/2+50,pauseMenu.getPositionY());
score.setTag(2);
this.addChild(score);
// 碰撞检测
this.schedule(this.collision);
return true;
},
collision:function(){
var bullets = this.bullets;
var enemies = this.enemies;
var tools = this.tools;
var score = parseInt(this.getChildByTag(2).getString());
for(var i in enemies){
var enemy = enemies[i];
// 检测是否与玩家碰撞
var player = this.getChildByTag(1);
if(cc.rectIntersectsRect(enemy.getBoundingBox(),player.getBoundingBox())){
// 游戏结束
this.unschedule(this.collision);
player.blowUp();
// 停止背景音乐
cc.audioEngine.stopMusic("res/sound/game_music.mp3");
cc.audioEngine.playEffect("res/sound/game_over.mp3");
this.scheduleOnce(function() {
cc.director.runScene(new cc.TransitionFade(1,new OverScene(score)));
},2);
}
// 检测是否吃到道具
for(var m in tools){
var tool = tools[m];
if(cc.rectIntersectsRect(tool.getBoundingBox(),player.getBoundingBox())){
switch(tool.type){
case 1:
// 双排子弹道具
cc.audioEngine.playEffect("res/sound/get_double_laser.mp3");
player.shootDoubleBegin();
break;
case 2:
// 清屏道具
cc.audioEngine.playEffect("res/sound/get_bomb.mp3");
var bomb = this.getChildByTag(3);
bomb.setString("X"+(parseInt(bomb.getString().slice(1))+1));
bomb.runAction(cc.sequence(cc.scaleTo(0.1,1.2),cc.scaleTo(0.1,1)));
break;
}
tool.remove();
}
}
for(var j in bullets){
var bullet = bullets[j];
// 检测是否与子弹碰撞
if(cc.rectIntersectsRect(enemy.getBoundingBox(),bullet.getBoundingBox())){
enemy.hit();
bullet.remove();
}
}
}
},
addScore:function(type){
var score = this.getChildByTag(2);
var addScore = 0;
var curScore = parseInt(score.getString());
switch(type){
case 1:
addScore = 100 + Math.ceil(Math.random()*(curScore/1000));
break;
case 2:
addScore = 200 + Math.ceil(Math.random()*(curScore/1000));
break;
case 3:
addScore = 500 + Math.ceil(Math.random()*(curScore/1000));
break;
}
score.setString(curScore+addScore);
},
createEnemy:function(type){
var enemy = new Enemy(type,this);
var randomX = Math.random()*(cc.winSize.width-enemy.width/2-enemy.width/2)+enemy.width/2;
enemy.setPosition(randomX,cc.winSize.height+enemy.height/2);
this.addChild(enemy);
this.enemies.push(enemy);
},
createTool:function(type){
var tool = new Tool(type,this);
var randomX = Math.random()*(cc.winSize.width-tool.width/2-tool.width/2)+tool.width/2;
tool.setPosition(randomX,cc.winSize.height+tool.height/2);
this.addChild(tool);
this.tools.push(tool);
},
onEnter:function(){
this._super();
// 添加触摸事件
cc.eventManager.addListener({
event:cc.EventListener.TOUCH_ONE_BY_ONE,
swallowTouches:true,
onTouchBegan:this.touchbegan,
onTouchMoved:this.touchmoved,
onTouchEnded:this.touchended
},this);
return true;
},
touchbegan:function(touch,event){
event.getCurrentTarget().touchStartX = touch.getLocation().x;
event.getCurrentTarget().touchStartY = touch.getLocation().y;
return true;
},
touchmoved:function(touch,event){
var touchX = touch.getLocation().x;
var touchY = touch.getLocation().y;
var touchStartX = event.getCurrentTarget().touchStartX;
var touchStartY = event.getCurrentTarget().touchStartY;
var player = event.getCurrentTarget().getChildByTag(1);
if(player!=null){
player.moveBy(touchX-touchStartX,touchY-touchStartY);
event.getCurrentTarget().touchStartX = touchX;
event.getCurrentTarget().touchStartY = touchY;
}
return true;
},
touchended:function(touch,event){
return true;
}
});